Main Text Figures
comb_epr_plot = comb_preds %>%
filter(metric == "EPR") %>%
ggplot() +
geom_point(aes(temp, rate, colour = curve_id),
filter(comb_d, metric == "EPR"),
size = 1.5, alpha = 0.6,
position = position_jitter(width = 0.5, height = 0)) +
geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id),
filter(comb_boot_conf_preds, metric == "EPR"),
fill = 'grey60', alpha = 0.3) +
geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
scale_colour_manual(values = comb_colors) +
labs(x = "",
y = "Egg Production \n(eggs/female/day)",
colour = "Month") +
theme_matt(base_size = 12)
comb_hs_plot = comb_preds %>%
filter(metric == "HF") %>%
ggplot() +
geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "HF"), size = 1.5, alpha = 0.6,
position = position_jitter(width = 0.5, height = 0)) +
geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "HF"), fill = 'grey60', alpha = 0.3) +
geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
labs(x = "",
y = "Hatching Success \n(%)",
colour = "Month") +
theme_matt(base_size = 12)
comb_rf_plot = comb_preds %>%
filter(metric == "RF") %>%
ggplot() +
geom_point(aes(temp, rate, colour = curve_id), filter(comb_d, metric == "RF"), size = 1.5, alpha = 0.6,
position = position_jitter(width = 0.5, height = 0)) +
geom_ribbon(aes(temp, ymin = conf_lower, ymax = conf_upper, group = curve_id), filter(comb_boot_conf_preds, metric == "RF"), fill = 'grey60', alpha = 0.3) +
geom_line(aes(temp, .fitted, col = curve_id), linewidth = 2) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
labs(x = "Temperature (°C)",
y = "Offspring Production \n(offspring/female/day)",
colour = "Month") +
theme_matt(base_size = 12)
comb_tsc = ggplot(comb_surv, aes(x=Temp, y=Surv, colour=Month)) +
geom_point(size=1.5, position=position_jitter(width=0.1, height=0.03)) +
xlab("Temperature (°C)")+
ylab("Survivorship \n(proportion survived)")+
labs(colour = "Month") +
geom_hline(yintercept = 0.5, linetype = "dashed") +
geom_smooth(method = "glm", method.args = list(family = "binomial"), se=T, linewidth = 2) +
scale_y_continuous(breaks = c(0,1)) +
#scale_color_brewer(type = "div", palette = 5, direction = -1) +
#scale_color_viridis_d(option = "mako") +
scale_colour_manual(values = comb_colors) +
theme_matt(base_size = 12)
ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc,
ncol = 2, nrow = 2,
common.legend = T, legend = "bottom",
labels = "AUTO", vjust = 1)

# ggarrange(comb_epr_plot, comb_hs_plot, comb_rf_plot, comb_tsc, nrow = 1,
# common.legend = T, legend = "bottom")
combined_opt_coll = comb_params %>%
filter(metric == "RF" & term == "topt") %>%
ggplot(aes(x = growth_temp, y = estimate, shape = species)) +
geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
scale_shape_manual(values = c(16,21)) +
ylab("Optimum (°C)") +
xlab("Collection Temperature (°C)") +
labs(colour = "Month") +
theme_matt(base_size = 12)
combined_opt_diff = comb_params %>%
filter(metric == "RF" & term == "topt") %>%
ggplot(aes(x = growth_temp, y = margin, shape = species)) +
geom_hline(yintercept = 0, linewidth =1, linetype = "dashed") +
geom_smooth(data = filter(comb_params, metric == "RF" & term == "topt" & curve_id != "November_2"),
method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
ylab("Margin (°C)") +
xlab("Collection Temperature (°C)") +
scale_shape_manual(values = c(16,21)) +
theme_matt(base_size = 12)
combined_ld_coll = ggplot(combined_tolerance, aes(x = Coll_temp, y = LD50, shape = species)) +
geom_smooth(method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
scale_shape_manual(values = c(16,21)) +
ylab("Thermal Tolerance (°C)") +
xlab("Collection Temperature (°C)") +
theme_matt(base_size = 12)
combined_ld_diff = ggplot(combined_tolerance, aes(x = Coll_temp, y = margin, shape = species)) +
geom_smooth(method = "lm", colour = "grey50") +
geom_point(size = 3, stroke = 1) +
scale_shape_manual(values = c(16,21)) +
ylab("Warming Tolerance (°C)") +
xlab("Collection Temperature (°C)") +
theme_matt(base_size = 12)
ggarrange(combined_opt_coll, combined_opt_diff, combined_ld_coll, combined_ld_diff, ncol = 2, nrow = 2, common.legend = T,
legend = "bottom", labels = "AUTO")

F0_hatched.model = lme4::glmer(data = f0_model_data, family = poisson,
Hatched ~ Treatment * Day +
(1|Month) + (1|female_ID))
summary(F0_hatched.model)
## Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
## Family: poisson ( log )
## Formula: Hatched ~ Treatment * Day + (1 | Month) + (1 | female_ID)
## Data: f0_model_data
##
## AIC BIC logLik deviance df.resid
## 8235.0 8259.5 -4111.5 8223.0 426
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -8.9713 -2.0464 -0.4943 2.1551 7.5467
##
## Random effects:
## Groups Name Variance Std.Dev.
## female_ID (Intercept) 1.468 1.211
## Month (Intercept) 2.239 1.496
## Number of obs: 432, groups: female_ID, 216; Month, 3
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 3.30143 0.87265 3.783 0.000155 ***
## TreatmentHeatwave 0.22773 0.16967 1.342 0.179539
## Day5_to_7 -0.37316 0.01665 -22.413 < 2e-16 ***
## TreatmentHeatwave:Day5_to_7 -0.22533 0.02352 -9.581 < 2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) TrtmnH Dy5__7
## TretmntHtwv -0.098
## Day5_to_7 -0.008 0.040
## TrtmH:D5__7 0.006 -0.053 -0.708
car::Anova(F0_hatched.model, type = "III")
## Analysis of Deviance Table (Type III Wald chisquare tests)
##
## Response: Hatched
## Chisq Df Pr(>Chisq)
## (Intercept) 14.3129 1 0.0001548 ***
## Treatment 1.8014 1 0.1795386
## Day 502.3581 1 < 2.2e-16 ***
## Treatment:Day 91.7891 1 < 2.2e-16 ***
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
f0_model_females = F0_epr %>%
group_by(Month, Treatment, Female) %>%
count() %>%
filter(n == 2) %>%
mutate('female_ID' = paste(Month, Treatment, Female, sep = "_"))
f0_model_data = F0_epr %>%
mutate('female_ID' = paste(Month, Treatment, Female, sep = "_")) %>%
filter(female_ID %in% f0_model_females$female_ID)
f0_summary = f0_model_data %>%
group_by(Month, Treatment, Day) %>%
summarise("mean_hatched" = mean(Hatched, na.rm = T),
"hatched_se" = st.err(Hatched, na.rm = T)) %>%
ungroup() %>%
mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
Month = fct_relevel(Month, "June", "August", "November"),
Day = fct_relevel(Day, "Short", "Long"))
ggplot(f0_summary,
aes(x = Month, y = mean_hatched, colour = Treatment)) +
facet_grid(.~Day, scales = "free_y") +
geom_hline(yintercept = 0) +
geom_errorbar(aes(ymin = mean_hatched - hatched_se,
ymax = mean_hatched + hatched_se),
width = 0.2, linewidth = 1,
position = position_dodge(width = 0.3)) +
geom_point(size = 4, position = position_dodge(width = 0.3)) +
scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) +
labs(x = "Month",
y = "Mean Offspring Production \n(offspring/female/day)") +
theme_matt() +
theme(panel.border = element_rect(fill = NA, colour = "black"),
legend.position = "bottom",
axis.text.x = element_text(angle = 300, hjust = 0, vjust = 0.5))

f1_model_data = F1_epr %>%
mutate(Offspring_temp = as.factor(Offspring_temp)) %>%
ungroup() %>%
mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
Month = fct_relevel(Month, "June", "August", "November"),
Day = fct_relevel(Day, "Short", "Long"))
ggplot(f1_model_data,
aes(x = Offspring_temp, y = Hatched, colour = Parental_treatment)) +
facet_grid(Month~Day) +
#geom_violin(position = position_dodge(width = 1)) +
geom_boxplot(position = position_dodge(width = 0.5),
width = 0.3) +
geom_point(position = position_dodge(width = 0.5),
alpha = 0.5) +
scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) +
scale_y_continuous(breaks = c(0, 100, 200)) +
labs(x = "Offspring Temp. (°C)",
y = "Offspring Production \n(offspring/female/day)",
colour = "Parental Treatment") +
theme_matt() +
theme(panel.border = element_rect(fill = NA, colour = "black"),
legend.position = "bottom")

F1_hatched.model = lme4::glmer(data = f1_model_data, family = poisson,
Hatched ~ Parental_treatment * Day * Offspring_temp +
(1 + Parental_treatment|Month))
summary(F1_hatched.model)
## Generalized linear mixed model fit by maximum likelihood (Laplace Approximation) ['glmerMod']
## Family: poisson ( log )
## Formula: Hatched ~ Parental_treatment * Day * Offspring_temp + (1 + Parental_treatment |
## Month)
## Data: f1_model_data
##
## AIC BIC logLik deviance df.resid
## 33587.5 33660.0 -16778.7 33557.5 916
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -12.080 -3.935 -1.187 2.948 27.215
##
## Random effects:
## Groups Name Variance Std.Dev. Corr
## Month (Intercept) 3.321 1.822
## Parental_treatmentHeatwave 3.064 1.750 -0.96
## Number of obs: 931, groups: Month, 3
##
## Fixed effects:
## Estimate Std. Error z value Pr(>|z|)
## (Intercept) 1.60247 1.04241 1.537 0.124
## Parental_treatmentHeatwave 0.71588 1.00227 0.714 0.475
## DayLong -0.61233 0.05000 -12.247 <2e-16 ***
## Offspring_temp17 1.14693 0.03469 33.063 <2e-16 ***
## Offspring_temp22 1.02875 0.03468 29.664 <2e-16 ***
## Parental_treatmentHeatwave:DayLong -0.80342 0.09293 -8.646 <2e-16 ***
## Parental_treatmentHeatwave:Offspring_temp17 0.71131 0.05197 13.687 <2e-16 ***
## Parental_treatmentHeatwave:Offspring_temp22 0.54682 0.05247 10.421 <2e-16 ***
## DayLong:Offspring_temp17 1.21272 0.05456 22.229 <2e-16 ***
## DayLong:Offspring_temp22 0.82261 0.05566 14.780 <2e-16 ***
## Parental_treatmentHeatwave:DayLong:Offspring_temp17 -0.15317 0.09738 -1.573 0.116
## Parental_treatmentHeatwave:DayLong:Offspring_temp22 -0.05691 0.09930 -0.573 0.567
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
##
## Correlation of Fixed Effects:
## (Intr) Prnt_H DayLng Off_17 Off_22 Pr_H:DL P_H:O_1 P_H:O_2 DL:O_1 DL:O_2
## Prntl_trtmH -0.961
## DayLong -0.017 0.017
## Offsprng_17 -0.024 0.025 0.507
## Offsprng_22 -0.024 0.025 0.507 0.731
## Prntl_tH:DL 0.009 -0.024 -0.538 -0.273 -0.273
## Prnt_H:O_17 0.016 -0.042 -0.338 -0.667 -0.488 0.458
## Prnt_H:O_22 0.016 -0.042 -0.335 -0.483 -0.661 0.454 0.816
## DyLng:Of_17 0.015 -0.015 -0.916 -0.636 -0.465 0.493 0.424 0.307
## DyLng:Of_22 0.015 -0.016 -0.898 -0.455 -0.623 0.483 0.304 0.412 0.823
## P_H:DL:O_17 -0.008 0.022 0.513 0.356 0.260 -0.954 -0.532 -0.433 -0.560 -0.461
## P_H:DL:O_22 -0.008 0.022 0.503 0.255 0.349 -0.936 -0.429 -0.526 -0.461 -0.560
## P_H:DL:O_1
## Prntl_trtmH
## DayLong
## Offsprng_17
## Offsprng_22
## Prntl_tH:DL
## Prnt_H:O_17
## Prnt_H:O_22
## DyLng:Of_17
## DyLng:Of_22
## P_H:DL:O_17
## P_H:DL:O_22 0.893
coefficients(F1_hatched.model)
## $Month
## (Intercept) Parental_treatmentHeatwave DayLong Offspring_temp17 Offspring_temp22
## June 3.2357331 -0.2739582 -0.6123292 1.146931 1.028746
## August 2.5110937 -0.7530331 -0.6123292 1.146931 1.028746
## November -0.9361519 3.1716816 -0.6123292 1.146931 1.028746
## Parental_treatmentHeatwave:DayLong Parental_treatmentHeatwave:Offspring_temp17
## June -0.8034179 0.7113092
## August -0.8034179 0.7113092
## November -0.8034179 0.7113092
## Parental_treatmentHeatwave:Offspring_temp22 DayLong:Offspring_temp17
## June 0.5468181 1.212715
## August 0.5468181 1.212715
## November 0.5468181 1.212715
## DayLong:Offspring_temp22 Parental_treatmentHeatwave:DayLong:Offspring_temp17
## June 0.8226093 -0.1531655
## August 0.8226093 -0.1531655
## November 0.8226093 -0.1531655
## Parental_treatmentHeatwave:DayLong:Offspring_temp22
## June -0.05690774
## August -0.05690774
## November -0.05690774
##
## attr(,"class")
## [1] "coef.mer"
car::Anova(F1_hatched.model, type = "III")
## Analysis of Deviance Table (Type III Wald chisquare tests)
##
## Response: Hatched
## Chisq Df Pr(>Chisq)
## (Intercept) 2.3632 1 0.12423
## Parental_treatment 0.5102 1 0.47507
## Day 149.9922 1 < 2e-16 ***
## Offspring_temp 1158.0413 2 < 2e-16 ***
## Parental_treatment:Day 74.7488 1 < 2e-16 ***
## Parental_treatment:Offspring_temp 189.0279 2 < 2e-16 ***
## Day:Offspring_temp 532.5149 2 < 2e-16 ***
## Parental_treatment:Day:Offspring_temp 5.8855 2 0.05272 .
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
f1_size_data = F1_fbs %>%
ungroup() %>%
mutate(Day = if_else(Day == "1_to_3", "Short", "Long"),
Month = fct_relevel(Month, "June", "August", "November"),
Day = fct_relevel(Day, "Short", "Long"))
F1_size.model = lme4::lmer(data = f1_size_data,
Size ~ Parental_treatment * Offspring_temp * Day * Month +
(1|Month))
summary(F1_size.model)
## Linear mixed model fit by REML ['lmerMod']
## Formula: Size ~ Parental_treatment * Offspring_temp * Day * Month + (1 | Month)
## Data: f1_size_data
##
## REML criterion at convergence: -2830
##
## Scaled residuals:
## Min 1Q Median 3Q Max
## -3.5169 -0.6071 -0.0512 0.6534 3.7749
##
## Random effects:
## Groups Name Variance Std.Dev.
## Month (Intercept) 0.000417 0.02042
## Residual 0.001721 0.04149
## Number of obs: 864, groups: Month, 3
##
## Fixed effects:
## Estimate Std. Error t value
## (Intercept) 1.1129676 0.0279917 39.761
## Parental_treatmentHeatwave -0.2021937 0.0314027 -6.439
## Offspring_temp -0.0116568 0.0010991 -10.606
## DayLong -0.0639884 0.0270852 -2.362
## MonthAugust -0.0778029 0.0406730 -1.913
## MonthNovember -0.1583042 0.0620470 -2.551
## Parental_treatmentHeatwave:Offspring_temp 0.0105033 0.0017407 6.034
## Parental_treatmentHeatwave:DayLong 0.1530333 0.0414772 3.690
## Offspring_temp:DayLong 0.0033498 0.0015625 2.144
## Parental_treatmentHeatwave:MonthAugust 0.1597975 0.0426050 3.751
## Parental_treatmentHeatwave:MonthNovember 0.0138210 0.0735478 0.188
## Offspring_temp:MonthAugust 0.0030094 0.0016350 1.841
## Offspring_temp:MonthNovember 0.0104002 0.0037188 2.797
## DayLong:MonthAugust -0.0208334 0.0394776 -0.528
## DayLong:MonthNovember 0.1684485 0.0627450 2.685
## Parental_treatmentHeatwave:Offspring_temp:DayLong -0.0074358 0.0023391 -3.179
## Parental_treatmentHeatwave:Offspring_temp:MonthAugust -0.0104701 0.0023926 -4.376
## Parental_treatmentHeatwave:Offspring_temp:MonthNovember -0.0008553 0.0044990 -0.190
## Parental_treatmentHeatwave:DayLong:MonthAugust -0.0655264 0.0576266 -1.137
## Parental_treatmentHeatwave:DayLong:MonthNovember 0.0366208 0.0858275 0.427
## Offspring_temp:DayLong:MonthAugust 0.0021581 0.0022665 0.952
## Offspring_temp:DayLong:MonthNovember -0.0099254 0.0040868 -2.429
## Parental_treatmentHeatwave:Offspring_temp:DayLong:MonthAugust 0.0029113 0.0032879 0.885
## Parental_treatmentHeatwave:Offspring_temp:DayLong:MonthNovember -0.0041042 0.0051223 -0.801
coefficients(F1_size.model)
## $Month
## (Intercept) Parental_treatmentHeatwave Offspring_temp DayLong MonthAugust
## June 1.112968 -0.2021937 -0.01165684 -0.06398839 -0.07780293
## August 1.112968 -0.2021937 -0.01165684 -0.06398839 -0.07780293
## November 1.112968 -0.2021937 -0.01165684 -0.06398839 -0.07780293
## MonthNovember Parental_treatmentHeatwave:Offspring_temp
## June -0.1583042 0.01050334
## August -0.1583042 0.01050334
## November -0.1583042 0.01050334
## Parental_treatmentHeatwave:DayLong Offspring_temp:DayLong
## June 0.1530333 0.003349841
## August 0.1530333 0.003349841
## November 0.1530333 0.003349841
## Parental_treatmentHeatwave:MonthAugust Parental_treatmentHeatwave:MonthNovember
## June 0.1597975 0.01382099
## August 0.1597975 0.01382099
## November 0.1597975 0.01382099
## Offspring_temp:MonthAugust Offspring_temp:MonthNovember DayLong:MonthAugust
## June 0.003009359 0.01040017 -0.02083344
## August 0.003009359 0.01040017 -0.02083344
## November 0.003009359 0.01040017 -0.02083344
## DayLong:MonthNovember Parental_treatmentHeatwave:Offspring_temp:DayLong
## June 0.1684485 -0.007435826
## August 0.1684485 -0.007435826
## November 0.1684485 -0.007435826
## Parental_treatmentHeatwave:Offspring_temp:MonthAugust
## June -0.01047015
## August -0.01047015
## November -0.01047015
## Parental_treatmentHeatwave:Offspring_temp:MonthNovember
## June -0.0008553403
## August -0.0008553403
## November -0.0008553403
## Parental_treatmentHeatwave:DayLong:MonthAugust
## June -0.06552641
## August -0.06552641
## November -0.06552641
## Parental_treatmentHeatwave:DayLong:MonthNovember Offspring_temp:DayLong:MonthAugust
## June 0.03662077 0.002158149
## August 0.03662077 0.002158149
## November 0.03662077 0.002158149
## Offspring_temp:DayLong:MonthNovember
## June -0.009925365
## August -0.009925365
## November -0.009925365
## Parental_treatmentHeatwave:Offspring_temp:DayLong:MonthAugust
## June 0.002911311
## August 0.002911311
## November 0.002911311
## Parental_treatmentHeatwave:Offspring_temp:DayLong:MonthNovember
## June -0.004104211
## August -0.004104211
## November -0.004104211
##
## attr(,"class")
## [1] "coef.mer"
car::Anova(F1_size.model, type = "III")
## Analysis of Deviance Table (Type III Wald chisquare tests)
##
## Response: Size
## Chisq Df Pr(>Chisq)
## (Intercept) 1580.9097 1 < 2.2e-16 ***
## Parental_treatment 41.4574 1 1.205e-10 ***
## Offspring_temp 112.4837 1 < 2.2e-16 ***
## Day 5.5814 1 0.0181527 *
## Month 7.8995 2 0.0192594 *
## Parental_treatment:Offspring_temp 36.4100 1 1.599e-09 ***
## Parental_treatment:Day 13.6130 1 0.0002246 ***
## Offspring_temp:Day 4.5960 1 0.0320460 *
## Parental_treatment:Month 15.1607 2 0.0005104 ***
## Offspring_temp:Month 9.5403 2 0.0084791 **
## Day:Month 9.1255 2 0.0104334 *
## Parental_treatment:Offspring_temp:Day 10.1054 1 0.0014784 **
## Parental_treatment:Offspring_temp:Month 20.3284 2 3.852e-05 ***
## Parental_treatment:Day:Month 2.0620 2 0.3566473
## Offspring_temp:Day:Month 8.6232 2 0.0134123 *
## Parental_treatment:Offspring_temp:Day:Month 2.1096 2 0.3482539
## ---
## Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
day_cols = c("Short" = "grey80", "Long" = "grey30")
size_temp1 = ggplot(f1_size_data, aes(x = Offspring_temp, y = Size, colour = Parental_treatment)) +
facet_grid(Month~Day) +
geom_jitter(width = 0.5, size = 1.6, alpha = 0.4) +
geom_smooth(method = "lm", size = 1.4, alpha = 0.2) +
labs(x = "Offspring Temperature (°C)",
y = "Size (mm)",
colour = "Parental Treatment") +
scale_x_continuous(breaks = c(12,17,22)) +
scale_colour_manual(values = c("Heatwave" = "coral3", "Control" = "skyblue3")) +
theme_matt(base_size = 15) + theme(legend.position = "bottom",
panel.grid = element_blank(),
panel.border = element_rect(fill = NA, colour = "black"))
#car::Anova(f1_size.model, type = "III")
size_temp2 = emmeans::emtrends(F1_size.model, c("Month", "Day", "Parental_treatment"), var = "Offspring_temp") %>%
as.data.frame() %>%
ggplot(aes(x = Parental_treatment, y = Offspring_temp.trend,
colour = Day, group = Day)) +
facet_wrap(Month~.) +
geom_hline(yintercept = 0) +
geom_line(linewidth = 1.5,
position = position_dodge(width = 0.5)) +
geom_errorbar(aes(ymin = lower.CL, ymax = upper.CL),
size = 1.5, width = 0.5,
position = position_dodge(width = 0.5)) +
geom_point(size = 3,
position = position_dodge(width = 0.5)) +
scale_colour_manual(values = day_cols) +
labs(x = "Parental Treatment",
y = "Size Slope (mm / °C)") +
theme_matt(base_size = 15) +
theme(legend.position = "bottom",
axis.text.x = element_text(angle = 360-45,
hjust = 0, vjust = 0.5))
ggarrange(size_temp1, size_temp2, labels = "AUTO", common.legend = F, legend = "bottom")

# F0_rf_summary$month = factor(F0_rf_summary$month, levels = c("June", "August", "November"))
# F0_rf_summary$duration = factor(F0_rf_summary$duration, levels = c("short", "long"))
# F0_dur_summary$month = factor(F0_dur_summary$month, levels = c("June", "August", "November"))
#
# param_list = list("colour" = "black",
# "width" = 0.2)
#
# RF_short_db = plot(F0_RF_short,
# axes.title.fontsize = 10,
# tick.fontsize = 10,
# effsize.markersize = 3,
# swarmplot.params = param_list,
# rawplot.ylabel = "Production",
# theme = ggpubr::theme_pubr())
#
# RF_long_db = plot(F0_RF_long,
# axes.title.fontsize = 10,
# tick.fontsize = 10,
# effsize.markersize = 3,
# swarmplot.params = param_list,
# rawplot.ylabel = "Production",
# theme = ggpubr::theme_pubr())
#
# b1 = ggplot() + theme_pubclean() + ggtitle(" Short Heat Waves")
# b2 = ggplot() + theme_pubclean() + ggtitle(" Long Heat Waves")
# F0_fecundity_plot = ggarrange(b1, RF_short_db, b2, RF_long_db, ncol = 1, nrow = 4, heights = c(0.1, 1, 0.1, 1))
# x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long")
#
# F0_grid = F0_rf_summary %>%
# mutate(month = fct_relevel(month, "June", "August", "November")) %>%
# ggplot(aes(x = duration, y = difference, colour = trait, shape = duration)) +
# facet_grid(. ~ month) +
# geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
# geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1.3) +
# geom_point(size = 5, fill = "white") +
# scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) +
# scale_shape_manual(values = c("long" = 16, "short" = 21)) +
# scale_x_discrete(labels= x.axis_labels) +
# ggtitle("Direct Effects (F0)") +
# xlab("") +
# ylab("Effect Size\nHeatwave - Control") +
# ylim(-1,1.1) +
# theme_bw(base_size = 12) +
# theme(panel.grid = element_blank(),
# axis.text = element_text(colour = "black"),
# axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
# legend.position = "none")
#
# F1_summary = bind_rows(F1_rf_effect_size, F1_bs_effect_size) %>%
# dplyr::select(variable, difference,
# bca_ci_low, bca_ci_high,
# month, duration, trait, generation, off_temp) %>%
# mutate("order_code" = paste(trait, duration, sep = "_"),
# "order_number" = case_when(
# order_code == "production_short" ~ 1,
# order_code == "production_long" ~ 2,
# order_code == "body size_short" ~ 3,
# order_code == "body size_long" ~ 4),
# month = fct_relevel(month, "June", "August", "November"))
#
# F1_summary$order_number = factor(F1_summary$order_number, levels = c(1,2,3,4))
# F1_grid = ggplot(F1_summary, aes(x = order_number, y = difference, colour = trait, shape = duration, group = trait)) +
# facet_grid(off_temp ~ month, ) +
# geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
# geom_line() +
# geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1) +
# geom_point(size = 3, fill = "white") +
# scale_colour_manual(values = c("body size" = "grey75", "production" = "black")) +
# scale_shape_manual(values = c("long" = 16, "short" = 21)) +
# xlim(0.5,4.5) +
# scale_x_discrete(labels= x.axis_labels) +
# xlab("") +
# ylab("Effect Size\nHeatwave - Control") +
# ggtitle("Transgenerational Effects (F1)") +
# theme_bw(base_size = 12) +
# theme(panel.grid = element_blank(),
# strip.background.x = element_blank(),
# strip.text.x = element_blank(),
# axis.text = element_text(colour = "black"),
# axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))
#
# ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.45,1), common.legend = T, legend = "right")
Supplemental Information
#field tpc parameters
comb_params %>%
mutate(curve_id = fct_relevel(curve_id, c("January", "February", "March", "April", "May", "June",
"July", "August", "September", "October", "November_1", "November_2"))) %>%
ggplot(aes(x = curve_id, y = estimate, colour = species)) +
facet_wrap(term~metric, scales = 'free_y') +
geom_point(size = 4) +
geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
scale_colour_manual(values = c("royalblue1", "indianred2")) +
labs(x = "Month",
y = "Parameter Estimate",
colour = "Species") +
theme_bw(base_size = 16) +
theme(panel.grid = element_blank(),
axis.text.x = element_text(angle = 315, hjust = 0, vjust = 0.5))

#field tpc parameters
ggplot(comb_params, aes(x = growth_temp, y = estimate, colour = species)) +
facet_wrap(term~metric, scales = 'free_y') +
geom_smooth(data = filter(comb_params, curve_id != "November_2"),
method = "lm", se = F) +
geom_point(size = 4) +
geom_linerange(aes(ymin = conf_lower, ymax = conf_upper)) +
scale_colour_manual(values = c("royalblue1", "indianred2")) +
labs(x = "Collection Temperature (°C)",
y = "Parameter Estimate",
colour = "Species") +
theme_bw(base_size = 12) +
theme(panel.grid = element_blank())

comb_params %>%
filter(term == "topt") %>%
ggplot(aes(x = growth_temp, y = margin, colour = species, group = species)) +
facet_grid(metric~., scales = 'free_y') +
geom_hline(yintercept = 0) +
geom_smooth(data = filter(comb_params, term == "topt" & curve_id != "November_2"),
method = "lm", se = F, linewidth = 1, colour = "black") +
geom_point(size = 4) +
scale_colour_manual(values = c("royalblue1", "indianred2")) +
labs(x = "Collection Temperature",
y = "Safety Margin") +
theme_bw(base_size = 18) +
theme(panel.grid = element_blank())

ggplot(f0_model_data,
aes(x = Day, y = Hatched, colour = Month, group = female_ID)) +
facet_grid(Month~Treatment, scales = "free_y") +
geom_line() +
theme_matt() +
theme(panel.border = element_rect(fill = NA, colour = "black"))

# #Subsequent Rows
# F1_hs_effect_size$trait = "success"
# F1_hs_effect_size$generation = "F1"
#
# F1_total_effect_size$trait = "epr"
# F1_total_effect_size$generation = "F1"
#
# F1_rf_effect_size$trait = "production"
# F1_rf_effect_size$generation = "F1"
#
# F1_bs_effect_size$trait = "body size"
# F1_bs_effect_size$generation = "F1"
#
# F0_data = bind_rows(F0_hs_summary, F0_total_summary,F0_rf_summary, F0_size_summary) %>%
# dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, trait, generation) %>%
# mutate("order_code" = paste(trait, duration, sep = "_"),
# "order_number" = case_when(
# order_code == "total_short" ~ 1,
# order_code == "total_long" ~ 2,
# order_code == "success_short" ~ 3,
# order_code == "success_long" ~ 4,
# order_code == "production_short" ~ 5,
# order_code == "production_long" ~ 6,
# order_code == "size_long" ~ 7),
# month = fct_relevel(month, "June", "August", "November"),
# trait = fct_relevel(trait, "total", "success", "production", "size"),
# duration = fct_relevel(duration, "short", "long"),
# group_ID = paste(month, trait, sep = "_"))
#
# F0_data$order_number = factor(F0_data$order_number, levels = c(1,2,3,4,5,6,7))
#
#
# F1_data = bind_rows(F1_total_effect_size, F1_hs_effect_size, F1_rf_effect_size, F1_bs_effect_size) %>%
# dplyr::select(trait, difference, bca_ci_low, bca_ci_high, month, duration, generation, off_temp) %>%
# mutate("order_code" = paste(trait, duration, sep = "_"),
# "order_number" = case_when(
# order_code == "epr_short" ~ 1,
# order_code == "epr_long" ~ 2,
# order_code == "success_short" ~ 3,
# order_code == "success_long" ~ 4,
# order_code == "production_short" ~ 5,
# order_code == "production_long" ~ 6,
# order_code == "body size_short" ~ 7,
# order_code == "body size_long" ~ 8),
# trait = if_else(trait == "epr", "total", trait),
# month = fct_relevel(month, "June", "August", "November"),
# trait = fct_relevel(trait, "total", "success", "production", "size"),
# duration = fct_relevel(duration, "short", "long"))
#
#
# F1_data$order_number = factor(F1_data$order_number, levels = c(1,2,3,4,5,6,7,8))
#
# #Top row - F0 (direct effects)
# x.axis_labels = c("1" = "short", "2" = "long", "3" = "short", "4" = "long",
# "5" = "short", "6" = "long", "7" = "short", "8" = "long")
#
# F0_grid = ggplot(F0_data, aes(x = duration, y = difference, colour = trait, group = group_ID)) +
# facet_grid(. ~ month) +
# geom_line(position = position_dodge(width = 0.7),
# linewidth = 1) +
# geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
# geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1,
# position = position_dodge(width = 0.7)) +
# geom_point(size = 4, fill = "white", position = position_dodge(width = 0.7)) +
# scale_shape_manual(values = c("long" = 16, "short" = 21)) +
# scale_x_discrete(labels= x.axis_labels) +
# scale_colour_manual(values = c("size" = "darkgrey",
# "success" = "gold",
# "production" = "forestgreen",
# "total" = "cornflowerblue")) +
# xlab("") +
# ylab("Effect Size\nHeatwave - Control") +
# theme_bw(base_size = 12) +
# theme(panel.grid = element_blank(),
# axis.text = element_text(colour = "black"),
# axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5),
# legend.position = "none")
#
# #Following three rows - F1 (transgeneration / indirect effects)
# F1_grid = ggplot(F1_data, aes(x = duration, y = difference, colour = trait, group = trait)) +
# facet_grid(off_temp ~ month, ) +
# geom_hline(yintercept = 0, colour = "black", linewidth = 0.3) +
# geom_line(position = position_dodge(width = 0.5),
# linewidth = 1) +
# geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high), width = 0, linewidth = 1,
# position = position_dodge(width = 0.5)) +
# geom_point(size = 3, fill = "white", position = position_dodge(width = 0.5)) +
# scale_shape_manual(values = c("long" = 16, "short" = 21)) +
# xlim(0.5,4.5) +
# scale_x_discrete(labels= x.axis_labels) +
# scale_colour_manual(values = c("size" = "darkgrey",
# "success" = "gold",
# "production" = "forestgreen",
# "total" = "cornflowerblue")) +
# xlab("") +
# ylab("Effect Size \nHeatwave - Control") +
# theme_bw(base_size = 12) +
# theme(panel.grid = element_blank(),
# strip.background.x = element_blank(),
# strip.text.x = element_blank(),
# axis.text = element_text(colour = "black"),
# axis.text.x = element_text(angle = -45, hjust = 0, vjust = 0.5))
#
# ggarrange(F0_grid, F1_grid, nrow = 2, ncol = 1, heights = c(0.35,1), common.legend = T, legend = "right", labels = "AUTO")
# effect_corr = F1_summary %>%
# select(trait, difference, month, duration, off_temp) %>%
# pivot_wider(id_cols = c(month, duration, off_temp),
# names_from = trait,
# values_from = difference)
#
# ggplot(effect_corr, aes(x = `body size`, y = production)) +
# geom_hline(yintercept = 0) +
# geom_vline(xintercept = 0) +
# geom_point(size = 3) +
# geom_smooth(method = "lm", se = F,
# colour = "grey60",
# size = 1) +
# labs(x = "Body Size Effect",
# y = "Production Effect") +
# theme_matt()
#Effect of heatwave duration WITHIN treatment
f0_model_data %>%
group_by(Treatment, Day, Month) %>%
summarise(mean_hatched = mean(Hatched, na.rm = T)) %>%
ungroup() %>%
pivot_wider(id_cols = c("Treatment", "Month"),
values_from = mean_hatched,
names_from = Day) %>%
mutate("effect" = `5_to_7` - `1_to_3`)
## # A tibble: 6 × 5
## Treatment Month `1_to_3` `5_to_7` effect
## <chr> <chr> <dbl> <dbl> <dbl>
## 1 Control August 125. 67.2 -57.3
## 2 Control June 104. 84.4 -19.6
## 3 Control November 0.871 7.26 6.39
## 4 Heatwave August 170. 84.4 -85.4
## 5 Heatwave June 108. 58.3 -49.6
## 6 Heatwave November 2.2 11.5 9.26
duration.model = lme4::lmer(data = f0_model_data,
Hatched ~ Treatment * Day * Month + (1|Month))
duration_pairs = emmeans::emmeans(duration.model,
~ Day | Month * Treatment) %>%
pairs()
as.data.frame(summary(duration_pairs))[c('Month',
'Treatment',
'contrast',
'estimate',
'SE')] %>%
mutate(Month = fct_relevel(Month, c("June", "August", "November")),
estimate = estimate * -1) %>% #Flips sign to make contrast Long - Short
ggplot(aes(x = Month, fill = Treatment, y = estimate)) +
geom_bar(stat = "identity", position = position_dodge(width = 0.9), colour = "black", size = 1) +
geom_errorbar(aes(ymin = estimate - SE, ymax = estimate + SE),
width = 0.1, size = 1,
position = position_dodge(width = 0.9)) +
geom_hline(yintercept = 0) +
scale_fill_manual(values = c("grey30", "white")) +
labs(x = "",
y = "Duration Contrast \n Long - Short events") +
theme_pubr(base_size = 18)

# How does heat wave duration affect transgenerational effects? Reaction norms shown below for effect size comparisons (heatwave - control) for different duration of parental exposure
# F1_data %>%
# dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>%
# mutate("ID" = paste(month, off_temp, trait, sep = "_"),
# month = fct_relevel(month, c("June", "August", "November")),
# duration = fct_relevel(duration, c("short", "long"))) %>%
# ggplot(aes(x = duration, y = difference, colour = month, group = ID)) +
# facet_wrap(trait~.) +
# geom_hline(yintercept = 0) +
# geom_line(size = 1, position = position_dodge(width = 0.1)) +
# geom_point(size = 2, position = position_dodge(width = 0.1)) +
# geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
# size = 0.75, width = 0.1,
# position = position_dodge(width = 0.1)) +
# labs(x = "Parental Exposure Duration",
# y = "Effect Size (Hedge's g) \n Heatwave - Control") +
# ylim(-5,5) +
# theme_pubr(base_size = 18)
# #Pulls out reaction norms where there's a sign change (changes from positive, neutral, or negative between duration groups)
#
# duration_effects = F1_data %>%
# dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>%
# mutate("ID" = paste(month, off_temp, trait, sep = "_"),
# month = fct_relevel(month, c("June", "August", "November")),
# duration = fct_relevel(duration, c("short", "long"))) %>%
# group_by(ID, trait, duration) %>%
# mutate("zero_diff" = case_when(
# sign(bca_ci_low) == sign(bca_ci_high) ~ "does not overlap zero",
# sign(bca_ci_low) != sign(bca_ci_high) ~ "overlaps zero"
# )) %>%
# ungroup(duration) %>%
# mutate("change" = case_when(
# sign(difference)[1] == sign(difference)[2] & zero_diff[1] == zero_diff[2] ~ "Same",
# sign(difference)[1] != sign(difference)[2] & zero_diff[1] == "overlaps zero" & zero_diff[2] == "overlaps zero" ~ "Same",
# sign(difference)[1] != sign(difference)[2] & zero_diff[1] == zero_diff[2] & zero_diff[1] == "does not overlap zero" ~ "Different",
# sign(difference)[1] != sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different",
# sign(difference)[1] == sign(difference)[2] & zero_diff[1] != zero_diff[2] ~ "Different"
# )) %>%
# arrange(month, off_temp, trait) %>%
# filter(change == "Different")
#
# select_rnorms = duration_effects %>%
# dplyr::select(-duration, -difference, -bca_ci_low, -bca_ci_high, -ID, -zero_diff) %>%
# distinct()
#
# sig_changes = F1_data %>%
# dplyr::select(month, duration, off_temp, trait, difference, bca_ci_low, bca_ci_high) %>%
# mutate("ID" = paste(month, off_temp, trait, sep = "_"),
# month = fct_relevel(month, c("June", "August", "November")),
# duration = fct_relevel(duration, c("short", "long"))) %>%
# filter(ID %in% select_rnorms$ID)
#
# ggplot(sig_changes, aes(x = duration, y = difference, colour = month, group = ID)) +
# facet_wrap(trait~.) +
# geom_hline(yintercept = 0) +
# geom_line(size = 1, position = position_dodge(width = 0.1)) +
# geom_point(size = 2, position = position_dodge(width = 0.1)) +
# geom_errorbar(aes(ymin = bca_ci_low, ymax = bca_ci_high),
# size = 0.75, width = 0.1,
# position = position_dodge(width = 0.1)) +
# geom_label_repel(data = sig_changes %>% filter(duration == "long"),
# aes(label = off_temp,
# x = duration,
# y = difference,
# color = month),
# box.padding = 0.5,
# nudge_x = 0.2,
# size = 7,
# show.legend=FALSE) +
# labs(x = "Parental Exposure Duration",
# y = "Effect Size (Hedge's g)\nHeatwave - Control") +
# ylim(-5,5) +
# theme_pubr(base_size = 18)
LS0tCnRpdGxlOiAiRmlndXJlcyBmb3IgU2Vhc29uYWxseSB2YXJpYWJsZSB0aGVybWFsIHBlcmZvcm1hbmNlIGN1cnZlcyBwcmV2ZW50IGFkdmVyc2UgZWZmZWN0cyBvZiBoZWF0d2F2ZXMiCm91dHB1dDogCiAgaHRtbF9kb2N1bWVudDoKICAgICAgICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgICAgICAgY29kZV9kb3dubG9hZDogdHJ1ZQogICAgICAgICAgdG9jOiB0cnVlCiAgICAgICAgICB0b2NfZmxvYXQ6IHRydWUKICBnaXRodWJfZG9jdW1lbnQ6CiAgICAgICAgICB0b2M6IHRydWUKICAgICAgICAgIHRvY19kZXB0aDogMgogICAgICAgICAgaHRtbF9wcmV2aWV3OiBmYWxzZQplZGl0b3Jfb3B0aW9uczogCiAgY2h1bmtfb3V0cHV0X3R5cGU6IGNvbnNvbGUKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRSwgZmlnLmFsaWduPSJjZW50ZXIiLCBtZXNzYWdlID0gRiwgd2FybmluZyA9IEZ9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICBlY2hvID0ga25pdHI6OmlzX2h0bWxfb3V0cHV0KCksCiAgZmlnLmFsaWduID0gImxlZnQiLAogIGZpZy5wYXRoID0gIi4uL0ZpZ3VyZXMvbWFya2Rvd24vIiwKICBtZXNzYWdlID0gRkFMU0UsCiAgd2FybmluZyA9IEZBTFNFLAogIGNvbGxhcHNlID0gVCwKICBkZXYgPSBjKCJwbmciLCAicGRmIikKKQoKc3QuZXJyIDwtIGZ1bmN0aW9uKHgsIG5hLnJtPUZBTFNFKSB7CiAgaWYobmEucm09PVRSVUUpIHggPC0gbmEub21pdCh4KQogIHNkKHgpL3NxcnQobGVuZ3RoKHgpKQp9Cgp0aGVtZV9tYXR0ID0gZnVuY3Rpb24oYmFzZV9zaXplID0gMTgsCiAgICAgICAgICAgICAgICAgICAgICBkYXJrX3RleHQgPSAiZ3JleTIwIil7CiAgbWlkX3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVsyXQogIGxpZ2h0X3RleHQgPC0gIG1vbm9jaHJvbWVSOjpnZW5lcmF0ZV9wYWxldHRlKGRhcmtfdGV4dCwgImdvX2xpZ2h0ZXIiLCBuX2NvbG91cnMgPSA1KVszXQogIAogIGdncHVicjo6dGhlbWVfcHVicihiYXNlX2ZhbWlseT0ic2FucyIpICUrcmVwbGFjZSUgCiAgICB0aGVtZSgKICAgICAgcGFuZWwuYmFja2dyb3VuZCAgPSBlbGVtZW50X3JlY3QoZmlsbD0idHJhbnNwYXJlbnQiLCBjb2xvdXI9TkEpLCAKICAgICAgcGxvdC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwgCiAgICAgIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGZpbGw9InRyYW5zcGFyZW50IiwgY29sb3VyPU5BKSwKICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfcmVjdChmaWxsPSJ0cmFuc3BhcmVudCIsIGNvbG91cj1OQSksCiAgICAgIHRleHQgPSBlbGVtZW50X3RleHQoY29sb3VyID0gbWlkX3RleHQsIGxpbmVoZWlnaHQgPSAxLjEpLAogICAgICB0aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS41LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvdXIgPSBkYXJrX3RleHQpLAogICAgICBheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IGJhc2Vfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91ciA9IG1pZF90ZXh0KSwKICAgICAgYXhpcy50aXRsZSA9IGVsZW1lbnRfdGV4dChzaXplID0gYmFzZV9zaXplICogMS4yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcmdpbiA9IG1hcmdpbigwLCA4LCAwLCAwKSksCiAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9YmFzZV9zaXplICogMC45KSwKICAgICAgbGVnZW5kLnRpdGxlID0gZWxlbWVudF90ZXh0KHNpemUgPSBiYXNlX3NpemUgKiAwLjksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjZSA9ICJib2xkIiksCiAgICAgIHBsb3QubWFyZ2luID0gbWFyZ2luKDAuMjUsIDAuMjUsIDAuMjUsIDAuMjUsImNtIikKICAgICkKfQoKaDFfZXByJE1vbnRoID0gZmFjdG9yKGgxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXJfMSIsICJOb3ZlbWJlcl8yIikpCgpodWRzX2gxX2VwciRNb250aCA9IGZhY3RvcihodWRzX2gxX2VwciRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKdG9uc2FfY29sb3JzID0gYygiSnVseSIgPSAiIzc5MTEwMSIsICJBdWd1c3QiID0gIiNBRDIxMDYiLCAiU2VwdGVtYmVyIiA9ICIjQ0MzNDAzIiwgCiAgICAgICAgICAgICAgICAgIk9jdG9iZXIiID0gIiNFRjVGMDgiLCAiTm92ZW1iZXJfMSIgPSAiI0YyNzAwNiIsICJOb3ZlbWJlcl8yIiA9ICIjRUVCNjBBIikKCmh1ZHNfY29sb3JzID0gYygiSmFudWFyeSIgPSAiIzA2MUIyNCIsICJGZWJydWFyeSIgPSAiIzBGNDI1NiIsICJNYXJjaCIgPSAiIzE1NkQ4RCIsIAogICAgICAgICAgICAgICAgIkFwcmlsIiA9ICIjMkZBQURDIiwgIk1heSIgPSAiIzYxQkZFMyIsICJKdW5lIiA9ICIjOTdENUVFIikKCmNvbWJfY29sb3JzID0gYyhodWRzX2NvbG9ycywgdG9uc2FfY29sb3JzKQoKYSA9IGdncGxvdCgpICsgdGhlbWVfcHViY2xlYW4oKQoKc3VydiRNb250aCA9IGZhY3RvcihzdXJ2JE1vbnRoLCBsZXZlbHMgPSBjKCJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKaHVkc19zdXJ2JE1vbnRoID0gZmFjdG9yKGh1ZHNfc3VydiRNb250aCwgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIpKQoKY29tYl9wcmVkcyRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX3ByZWRzJGN1cnZlX2lkLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfZCRjdXJ2ZV9pZCA9IGZhY3Rvcihjb21iX2QkY3VydmVfaWQsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmNvbWJfc3VydiRNb250aCA9IGZhY3Rvcihjb21iX3N1cnYkTW9udGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygiSmFudWFyeSIsICJGZWJydWFyeSIsICJNYXJjaCIsICJBcHJpbCIsICJNYXkiLCAiSnVuZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJKdWx5IiwgIkF1Z3VzdCIsICJTZXB0ZW1iZXIiLCAiT2N0b2JlciIsICJOb3ZlbWJlcl8xIiwgIk5vdmVtYmVyXzIiKSkKCmBgYAoKIyMgTWFpbiBUZXh0IEZpZ3VyZXMKYGBge3IgZmlndXJlLTItY29tYmluZWQtdHBjcywgZmlnLmhlaWdodD02fQpjb21iX2Vwcl9wbG90ID0gY29tYl9wcmVkcyAlPiUgCiAgZmlsdGVyKG1ldHJpYyA9PSAiRVBSIikgJT4lIAogIGdncGxvdCgpICsKICBnZW9tX3BvaW50KGFlcyh0ZW1wLCByYXRlLCBjb2xvdXIgPSBjdXJ2ZV9pZCksIAogICAgICAgICAgICAgZmlsdGVyKGNvbWJfZCwgbWV0cmljID09ICJFUFIiKSwgCiAgICAgICAgICAgICBzaXplID0gMS41LCBhbHBoYSA9IDAuNiwgCiAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDAuNSwgaGVpZ2h0ID0gMCkpICsKICBnZW9tX3JpYmJvbihhZXModGVtcCwgeW1pbiA9IGNvbmZfbG93ZXIsIHltYXggPSBjb25mX3VwcGVyLCBncm91cCA9IGN1cnZlX2lkKSwgCiAgICAgICAgICAgICAgZmlsdGVyKGNvbWJfYm9vdF9jb25mX3ByZWRzLCBtZXRyaWMgPT0gIkVQUiIpLCAKICAgICAgICAgICAgICBmaWxsID0gJ2dyZXk2MCcsIGFscGhhID0gMC4zKSArCiAgZ2VvbV9saW5lKGFlcyh0ZW1wLCAuZml0dGVkLCBjb2wgPSBjdXJ2ZV9pZCksIGxpbmV3aWR0aCA9IDIpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICIiLCAKICAgICAgIHkgPSAiRWdnIFByb2R1Y3Rpb24gXG4oZWdncy9mZW1hbGUvZGF5KSIsCiAgICAgICBjb2xvdXIgPSAiTW9udGgiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpjb21iX2hzX3Bsb3QgPSBjb21iX3ByZWRzICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJIRiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXModGVtcCwgcmF0ZSwgY29sb3VyID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9kLCBtZXRyaWMgPT0gIkhGIiksIHNpemUgPSAxLjUsIGFscGhhID0gMC42LCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwKSkgKwogIGdlb21fcmliYm9uKGFlcyh0ZW1wLCB5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIsIGdyb3VwID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9ib290X2NvbmZfcHJlZHMsIG1ldHJpYyA9PSAiSEYiKSwgZmlsbCA9ICdncmV5NjAnLCBhbHBoYSA9IDAuMykgKwogIGdlb21fbGluZShhZXModGVtcCwgLmZpdHRlZCwgY29sID0gY3VydmVfaWQpLCBsaW5ld2lkdGggPSAyKSArCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICIiLCAKICAgICAgIHkgPSAiSGF0Y2hpbmcgU3VjY2VzcyBcbiglKSIsCiAgICAgICBjb2xvdXIgPSAiTW9udGgiKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpjb21iX3JmX3Bsb3QgPSBjb21iX3ByZWRzICU+JSAKICBmaWx0ZXIobWV0cmljID09ICJSRiIpICU+JSAKICBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2ludChhZXModGVtcCwgcmF0ZSwgY29sb3VyID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9kLCBtZXRyaWMgPT0gIlJGIiksIHNpemUgPSAxLjUsIGFscGhhID0gMC42LCAKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25faml0dGVyKHdpZHRoID0gMC41LCBoZWlnaHQgPSAwKSkgKwogIGdlb21fcmliYm9uKGFlcyh0ZW1wLCB5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIsIGdyb3VwID0gY3VydmVfaWQpLCBmaWx0ZXIoY29tYl9ib290X2NvbmZfcHJlZHMsIG1ldHJpYyA9PSAiUkYiKSwgZmlsbCA9ICdncmV5NjAnLCBhbHBoYSA9IDAuMykgKwogIGdlb21fbGluZShhZXModGVtcCwgLmZpdHRlZCwgY29sID0gY3VydmVfaWQpLCBsaW5ld2lkdGggPSAyKSArCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIGxhYnMoeCA9ICJUZW1wZXJhdHVyZSAowrBDKSIsIAogICAgICAgeSA9ICJPZmZzcHJpbmcgUHJvZHVjdGlvbiBcbihvZmZzcHJpbmcvZmVtYWxlL2RheSkiLAogICAgICAgY29sb3VyID0gIk1vbnRoIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKY29tYl90c2MgPSBnZ3Bsb3QoY29tYl9zdXJ2LCBhZXMoeD1UZW1wLCB5PVN1cnYsIGNvbG91cj1Nb250aCkpICsgCiAgZ2VvbV9wb2ludChzaXplPTEuNSwgcG9zaXRpb249cG9zaXRpb25faml0dGVyKHdpZHRoPTAuMSwgaGVpZ2h0PTAuMDMpKSArCiAgeGxhYigiVGVtcGVyYXR1cmUgKMKwQykiKSsKICB5bGFiKCJTdXJ2aXZvcnNoaXAgXG4ocHJvcG9ydGlvbiBzdXJ2aXZlZCkiKSsKICBsYWJzKGNvbG91ciA9ICJNb250aCIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMC41LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImdsbSIsIG1ldGhvZC5hcmdzID0gbGlzdChmYW1pbHkgPSAiYmlub21pYWwiKSwgc2U9VCwgbGluZXdpZHRoID0gMikgKwogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsMSkpICsgCiAgI3NjYWxlX2NvbG9yX2JyZXdlcih0eXBlID0gImRpdiIsIHBhbGV0dGUgPSA1LCBkaXJlY3Rpb24gPSAtMSkgKyAKICAjc2NhbGVfY29sb3JfdmlyaWRpc19kKG9wdGlvbiA9ICJtYWtvIikgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGNvbWJfY29sb3JzKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpCgpnZ2FycmFuZ2UoY29tYl9lcHJfcGxvdCwgY29tYl9oc19wbG90LCBjb21iX3JmX3Bsb3QsIGNvbWJfdHNjLCAKICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMiwKICAgICAgICAgIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAiYm90dG9tIiwgCiAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsIHZqdXN0ID0gMSkKCiMgZ2dhcnJhbmdlKGNvbWJfZXByX3Bsb3QsIGNvbWJfaHNfcGxvdCwgY29tYl9yZl9wbG90LCBjb21iX3RzYywgbnJvdyA9IDEsCiMgICAgICAgICAgIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAiYm90dG9tIikKYGBgCgpgYGB7ciBmaWd1cmUtMy1jdXJ2ZS1wYXJhbWV0ZXJzLCB3YXJuaW5nID0gRiwgbWVzc2FnZSA9IEYsIGZpZy53aWR0aD04LCBmaWcuaGVpZ2h0PTd9CmNvbWJpbmVkX29wdF9jb2xsID0gY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBlc3RpbWF0ZSwgc2hhcGUgPSBzcGVjaWVzKSkgKyAKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDIxKSkgKyAKICB5bGFiKCJPcHRpbXVtICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICBsYWJzKGNvbG91ciA9ICJNb250aCIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJpbmVkX29wdF9kaWZmID0gY29tYl9wYXJhbXMgJT4lIAogIGZpbHRlcihtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiKSAlPiUgCiAgZ2dwbG90KGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBtYXJnaW4sIHNoYXBlID0gc3BlY2llcykpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBsaW5ld2lkdGggPTEsIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBtZXRyaWMgPT0gIlJGIiAmIHRlcm0gPT0gInRvcHQiICYgY3VydmVfaWQgIT0gIk5vdmVtYmVyXzIiKSwKICAgICAgICAgICAgICBtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHlsYWIoIk1hcmdpbiAowrBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTIpIAoKY29tYmluZWRfbGRfY29sbCA9IGdncGxvdChjb21iaW5lZF90b2xlcmFuY2UsIGFlcyh4ID0gQ29sbF90ZW1wLCB5ID0gTEQ1MCwgc2hhcGUgPSBzcGVjaWVzKSkgKyAKICBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iLCBjb2xvdXIgPSAiZ3JleTUwIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSAzLCBzdHJva2UgPSAxKSArIAogIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDE2LDIxKSkgKyAKICB5bGFiKCJUaGVybWFsIFRvbGVyYW5jZSAowrBDKSIpICsgCiAgeGxhYigiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSAowrBDKSIpICsgCiAgdGhlbWVfbWF0dChiYXNlX3NpemUgPSAxMikKCmNvbWJpbmVkX2xkX2RpZmYgPSBnZ3Bsb3QoY29tYmluZWRfdG9sZXJhbmNlLCBhZXMoeCA9IENvbGxfdGVtcCwgeSA9IG1hcmdpbiwgc2hhcGUgPSBzcGVjaWVzKSkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIGNvbG91ciA9ICJncmV5NTAiKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDMsIHN0cm9rZSA9IDEpICsgCiAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoMTYsMjEpKSArIAogIHlsYWIoIldhcm1pbmcgVG9sZXJhbmNlICjCsEMpIikgKyAKICB4bGFiKCJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDEyKQoKZ2dhcnJhbmdlKGNvbWJpbmVkX29wdF9jb2xsLCBjb21iaW5lZF9vcHRfZGlmZiwgY29tYmluZWRfbGRfY29sbCwgY29tYmluZWRfbGRfZGlmZiwgbmNvbCA9IDIsIG5yb3cgPSAyLCBjb21tb24ubGVnZW5kID0gVCwKICAgICAgICAgIGxlZ2VuZCA9ICJib3R0b20iLCBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3J9CkYwX2hhdGNoZWQubW9kZWwgPSBsbWU0OjpnbG1lcihkYXRhID0gZjBfbW9kZWxfZGF0YSwgZmFtaWx5ID0gcG9pc3NvbiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXRjaGVkIH4gVHJlYXRtZW50ICogRGF5ICsgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxfE1vbnRoKSArICgxfGZlbWFsZV9JRCkpCgpzdW1tYXJ5KEYwX2hhdGNoZWQubW9kZWwpCmNhcjo6QW5vdmEoRjBfaGF0Y2hlZC5tb2RlbCwgdHlwZSA9ICJJSUkiKQpgYGAKCmBgYHtyIGYwLWhhdGNoZWQsIGZpZy53aWR0aD03LCBmaWcuaGVpZ2h0PTZ9CmYwX21vZGVsX2ZlbWFsZXMgPSBGMF9lcHIgJT4lIAogIGdyb3VwX2J5KE1vbnRoLCBUcmVhdG1lbnQsIEZlbWFsZSkgJT4lIAogIGNvdW50KCkgJT4lIAogIGZpbHRlcihuID09IDIpICU+JSAKICBtdXRhdGUoJ2ZlbWFsZV9JRCcgPSBwYXN0ZShNb250aCwgVHJlYXRtZW50LCBGZW1hbGUsIHNlcCA9ICJfIikpCgpmMF9tb2RlbF9kYXRhID0gRjBfZXByICU+JSAKICBtdXRhdGUoJ2ZlbWFsZV9JRCcgPSBwYXN0ZShNb250aCwgVHJlYXRtZW50LCBGZW1hbGUsIHNlcCA9ICJfIikpICU+JSAKICBmaWx0ZXIoZmVtYWxlX0lEICVpbiUgZjBfbW9kZWxfZmVtYWxlcyRmZW1hbGVfSUQpCgpmMF9zdW1tYXJ5ID0gZjBfbW9kZWxfZGF0YSAlPiUgCiAgZ3JvdXBfYnkoTW9udGgsIFRyZWF0bWVudCwgRGF5KSAlPiUgIAogIHN1bW1hcmlzZSgibWVhbl9oYXRjaGVkIiA9IG1lYW4oSGF0Y2hlZCwgbmEucm0gPSBUKSwKICAgICAgICAgICAgImhhdGNoZWRfc2UiID0gc3QuZXJyKEhhdGNoZWQsIG5hLnJtID0gVCkpICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShEYXkgPSBpZl9lbHNlKERheSA9PSAiMV90b18zIiwgIlNob3J0IiwgIkxvbmciKSwKICAgICAgICAgTW9udGggPSBmY3RfcmVsZXZlbChNb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiAgICAgICAgIERheSA9IGZjdF9yZWxldmVsKERheSwgIlNob3J0IiwgIkxvbmciKSkKCmdncGxvdChmMF9zdW1tYXJ5LCAKICAgICAgIGFlcyh4ID0gTW9udGgsIHkgPSBtZWFuX2hhdGNoZWQsIGNvbG91ciA9IFRyZWF0bWVudCkpICsgCiAgZmFjZXRfZ3JpZCgufkRheSwgc2NhbGVzID0gImZyZWVfeSIpICsgCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluID0gbWVhbl9oYXRjaGVkIC0gaGF0Y2hlZF9zZSwgCiAgICAgICAgICAgICAgICAgICAgeW1heCA9IG1lYW5faGF0Y2hlZCArIGhhdGNoZWRfc2UpLAogICAgICAgICAgICAgICAgd2lkdGggPSAwLjIsIGxpbmV3aWR0aCA9IDEsCiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4zKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4zKSkgKyAKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoIkhlYXR3YXZlIiA9ICJjb3JhbDMiLCAiQ29udHJvbCIgPSAic2t5Ymx1ZTMiKSkgKyAKICBsYWJzKHggPSAiTW9udGgiLCAKICAgICAgIHkgPSAiTWVhbiBPZmZzcHJpbmcgUHJvZHVjdGlvbiBcbihvZmZzcHJpbmcvZmVtYWxlL2RheSkiKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzAwLCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKYGBgCgpgYGB7ciBmMS1oYXRjaGVkLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD02fQpmMV9tb2RlbF9kYXRhID0gRjFfZXByICU+JSAKICBtdXRhdGUoT2Zmc3ByaW5nX3RlbXAgPSBhcy5mYWN0b3IoT2Zmc3ByaW5nX3RlbXApKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBtdXRhdGUoRGF5ID0gaWZfZWxzZShEYXkgPT0gIjFfdG9fMyIsICJTaG9ydCIsICJMb25nIiksCiAgICAgICAgIE1vbnRoID0gZmN0X3JlbGV2ZWwoTW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAogICAgICAgICBEYXkgPSBmY3RfcmVsZXZlbChEYXksICJTaG9ydCIsICJMb25nIikpCgpnZ3Bsb3QoZjFfbW9kZWxfZGF0YSwgCiAgICAgICBhZXMoeCA9IE9mZnNwcmluZ190ZW1wLCB5ID0gSGF0Y2hlZCwgY29sb3VyID0gUGFyZW50YWxfdHJlYXRtZW50KSkgKyAKICBmYWNldF9ncmlkKE1vbnRofkRheSkgKyAKICAjZ2VvbV92aW9saW4ocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDEpKSArIAogIGdlb21fYm94cGxvdChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgICAgd2lkdGggPSAwLjMpICsgCiAgZ2VvbV9wb2ludChwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC41KSwKICAgICAgICAgICAgIGFscGhhID0gMC41KSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIHNjYWxlX3lfY29udGludW91cyhicmVha3MgPSBjKDAsIDEwMCwgMjAwKSkgKyAKICBsYWJzKHggPSAiT2Zmc3ByaW5nIFRlbXAuICjCsEMpIiwgCiAgICAgICB5ID0gIk9mZnNwcmluZyBQcm9kdWN0aW9uIFxuKG9mZnNwcmluZy9mZW1hbGUvZGF5KSIsCiAgICAgICBjb2xvdXIgPSAiUGFyZW50YWwgVHJlYXRtZW50IikgKyAKICB0aGVtZV9tYXR0KCkgKyAKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X3JlY3QoZmlsbCA9IE5BLCBjb2xvdXIgPSAiYmxhY2siKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSAiYm90dG9tIikKYGBgCgpgYGB7cn0KRjFfaGF0Y2hlZC5tb2RlbCA9IGxtZTQ6OmdsbWVyKGRhdGEgPSBmMV9tb2RlbF9kYXRhLCBmYW1pbHkgPSBwb2lzc29uLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhdGNoZWQgfiBQYXJlbnRhbF90cmVhdG1lbnQgKiBEYXkgKiBPZmZzcHJpbmdfdGVtcCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMSArIFBhcmVudGFsX3RyZWF0bWVudHxNb250aCkpCgpzdW1tYXJ5KEYxX2hhdGNoZWQubW9kZWwpCmNvZWZmaWNpZW50cyhGMV9oYXRjaGVkLm1vZGVsKQpjYXI6OkFub3ZhKEYxX2hhdGNoZWQubW9kZWwsIHR5cGUgPSAiSUlJIikKYGBgCgpgYGB7cn0KZjFfc2l6ZV9kYXRhID0gRjFfZmJzICU+JSAKICB1bmdyb3VwKCkgJT4lIAogIG11dGF0ZShEYXkgPSBpZl9lbHNlKERheSA9PSAiMV90b18zIiwgIlNob3J0IiwgIkxvbmciKSwKICAgICAgICAgTW9udGggPSBmY3RfcmVsZXZlbChNb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiAgICAgICAgIERheSA9IGZjdF9yZWxldmVsKERheSwgIlNob3J0IiwgIkxvbmciKSkKCkYxX3NpemUubW9kZWwgPSBsbWU0OjpsbWVyKGRhdGEgPSBmMV9zaXplX2RhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICBTaXplIH4gUGFyZW50YWxfdHJlYXRtZW50ICogT2Zmc3ByaW5nX3RlbXAgKiBEYXkgKiBNb250aCArIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICgxfE1vbnRoKSkKCnN1bW1hcnkoRjFfc2l6ZS5tb2RlbCkKY29lZmZpY2llbnRzKEYxX3NpemUubW9kZWwpCmNhcjo6QW5vdmEoRjFfc2l6ZS5tb2RlbCwgdHlwZSA9ICJJSUkiKQpgYGAKCmBgYHtyIGYxLXNpemUsIGZpZy53aWR0aCA9IDEwLCBmaWcuaGVpZ2h0PTZ9CmRheV9jb2xzID0gYygiU2hvcnQiID0gImdyZXk4MCIsICJMb25nIiA9ICJncmV5MzAiKQoKc2l6ZV90ZW1wMSA9IGdncGxvdChmMV9zaXplX2RhdGEsIGFlcyh4ID0gT2Zmc3ByaW5nX3RlbXAsIHkgPSBTaXplLCBjb2xvdXIgPSBQYXJlbnRhbF90cmVhdG1lbnQpKSArIAogIGZhY2V0X2dyaWQoTW9udGh+RGF5KSArIAogIGdlb21faml0dGVyKHdpZHRoID0gMC41LCBzaXplID0gMS42LCBhbHBoYSA9IDAuNCkgKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsIHNpemUgPSAxLjQsIGFscGhhID0gMC4yKSArIAogIGxhYnMoeCA9ICJPZmZzcHJpbmcgVGVtcGVyYXR1cmUgKMKwQykiLAogICAgICAgeSA9ICJTaXplIChtbSkiLAogICAgICAgY29sb3VyID0gIlBhcmVudGFsIFRyZWF0bWVudCIpICsgCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IGMoMTIsMTcsMjIpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiSGVhdHdhdmUiID0gImNvcmFsMyIsICJDb250cm9sIiA9ICJza3libHVlMyIpKSArIAogIHRoZW1lX21hdHQoYmFzZV9zaXplID0gMTUpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gImJvdHRvbSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFuZWwuYm9yZGVyID0gZWxlbWVudF9yZWN0KGZpbGwgPSBOQSwgY29sb3VyID0gImJsYWNrIikpCgojY2FyOjpBbm92YShmMV9zaXplLm1vZGVsLCB0eXBlID0gIklJSSIpCnNpemVfdGVtcDIgPSBlbW1lYW5zOjplbXRyZW5kcyhGMV9zaXplLm1vZGVsLCBjKCJNb250aCIsICJEYXkiLCAiUGFyZW50YWxfdHJlYXRtZW50IiksIHZhciA9ICJPZmZzcHJpbmdfdGVtcCIpICU+JSAKICBhcy5kYXRhLmZyYW1lKCkgJT4lIAogIGdncGxvdChhZXMoeCA9IFBhcmVudGFsX3RyZWF0bWVudCwgeSA9IE9mZnNwcmluZ190ZW1wLnRyZW5kLCAKICAgICAgICAgICAgIGNvbG91ciA9IERheSwgZ3JvdXAgPSBEYXkpKSArIAogIGZhY2V0X3dyYXAoTW9udGh+LikgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAogIGdlb21fbGluZShsaW5ld2lkdGggPSAxLjUsCiAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBsb3dlci5DTCwgeW1heCA9IHVwcGVyLkNMKSwKICAgICAgICAgICAgICAgIHNpemUgPSAxLjUsIHdpZHRoID0gMC41LAogICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSkpICsgCiAgZ2VvbV9wb2ludChzaXplID0gMywKICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAogIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gZGF5X2NvbHMpICsgCiAgbGFicyh4ID0gIlBhcmVudGFsIFRyZWF0bWVudCIsICAKICAgICAgIHkgPSAiU2l6ZSBTbG9wZSAobW0gLyDCsEMpIikgKyAKICB0aGVtZV9tYXR0KGJhc2Vfc2l6ZSA9IDE1KSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJib3R0b20iLAogICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gMzYwLTQ1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQoKZ2dhcnJhbmdlKHNpemVfdGVtcDEsIHNpemVfdGVtcDIsIGxhYmVscyA9ICJBVVRPIiwgY29tbW9uLmxlZ2VuZCA9IEYsIGxlZ2VuZCA9ICJib3R0b20iKQpgYGAKCgpgYGB7cn0KIyBGMF9yZl9zdW1tYXJ5JG1vbnRoID0gZmFjdG9yKEYwX3JmX3N1bW1hcnkkbW9udGgsIGxldmVscyA9IGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpCiMgRjBfcmZfc3VtbWFyeSRkdXJhdGlvbiA9IGZhY3RvcihGMF9yZl9zdW1tYXJ5JGR1cmF0aW9uLCBsZXZlbHMgPSBjKCJzaG9ydCIsICJsb25nIikpCiMgRjBfZHVyX3N1bW1hcnkkbW9udGggPSBmYWN0b3IoRjBfZHVyX3N1bW1hcnkkbW9udGgsIGxldmVscyA9IGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpCiMgCiMgcGFyYW1fbGlzdCA9IGxpc3QoImNvbG91ciIgPSAiYmxhY2siLAojICAgICAgICAgICAgICAgICAgICJ3aWR0aCIgPSAwLjIpIAojIAojIFJGX3Nob3J0X2RiID0gcGxvdChGMF9SRl9zaG9ydCwgCiMgICAgICAgICAgICAgICAgICAgIGF4ZXMudGl0bGUuZm9udHNpemUgPSAxMCwKIyAgICAgICAgICAgICAgICAgICAgdGljay5mb250c2l6ZSA9IDEwLAojICAgICAgICAgICAgICAgICAgICBlZmZzaXplLm1hcmtlcnNpemUgPSAzLAojICAgICAgICAgICAgICAgICAgICBzd2FybXBsb3QucGFyYW1zID0gcGFyYW1fbGlzdCwKIyAgICAgICAgICAgICAgICAgICAgcmF3cGxvdC55bGFiZWwgPSAiUHJvZHVjdGlvbiIsCiMgICAgICAgICAgICAgICAgICAgIHRoZW1lID0gZ2dwdWJyOjp0aGVtZV9wdWJyKCkpCiMgCiMgUkZfbG9uZ19kYiA9IHBsb3QoRjBfUkZfbG9uZywgCiMgICAgICAgICAgICAgICAgICAgYXhlcy50aXRsZS5mb250c2l6ZSA9IDEwLAojICAgICAgICAgICAgICAgICAgIHRpY2suZm9udHNpemUgPSAxMCwKIyAgICAgICAgICAgICAgICAgICBlZmZzaXplLm1hcmtlcnNpemUgPSAzLAojICAgICAgICAgICAgICAgICAgIHN3YXJtcGxvdC5wYXJhbXMgPSBwYXJhbV9saXN0LAojICAgICAgICAgICAgICAgICAgIHJhd3Bsb3QueWxhYmVsID0gIlByb2R1Y3Rpb24iLAojICAgICAgICAgICAgICAgICAgIHRoZW1lID0gZ2dwdWJyOjp0aGVtZV9wdWJyKCkpCiMgCiMgYjEgPSBnZ3Bsb3QoKSArIHRoZW1lX3B1YmNsZWFuKCkgKyBnZ3RpdGxlKCIgICAgICAgICAgU2hvcnQgSGVhdCBXYXZlcyIpCiMgYjIgPSBnZ3Bsb3QoKSArIHRoZW1lX3B1YmNsZWFuKCkgKyBnZ3RpdGxlKCIgICAgICAgICAgTG9uZyBIZWF0IFdhdmVzIikKIyBGMF9mZWN1bmRpdHlfcGxvdCA9IGdnYXJyYW5nZShiMSwgUkZfc2hvcnRfZGIsIGIyLCBSRl9sb25nX2RiLCBuY29sID0gMSwgbnJvdyA9IDQsIGhlaWdodHMgPSBjKDAuMSwgMSwgMC4xLCAxKSkKYGBgCgpgYGB7ciBmaWd1cmUtNC1zaW0taGVhdHdhdmUtZWZmZWN0cywgZmlnLmhlaWdodD02LCBmaWcud2lkdGg9NX0KIyB4LmF4aXNfbGFiZWxzID0gYygiMSIgPSAic2hvcnQiLCAiMiIgPSAibG9uZyIsICIzIiA9ICJzaG9ydCIsICI0IiA9ICJsb25nIikKIyAKIyBGMF9ncmlkID0gRjBfcmZfc3VtbWFyeSAlPiUgCiMgICBtdXRhdGUobW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24pKSArIAojICAgZmFjZXRfZ3JpZCguIH4gbW9udGgpICsgCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwLCBjb2xvdXIgPSAiYmxhY2siLCBsaW5ld2lkdGggPSAwLjMpICsKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEuMykgKyAKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDUsIGZpbGwgPSAid2hpdGUiKSArIAojICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJib2R5IHNpemUiID0gImdyZXk3NSIsICJwcm9kdWN0aW9uIiA9ICJibGFjayIpKSArIAojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiMgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwojICAgZ2d0aXRsZSgiRGlyZWN0IEVmZmVjdHMgKEYwKSIpICsgCiMgICB4bGFiKCIiKSArCiMgICB5bGFiKCJFZmZlY3QgU2l6ZVxuSGVhdHdhdmUgLSBDb250cm9sIikgKyAKIyAgIHlsaW0oLTEsMS4xKSArIAojICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQojIAojIEYxX3N1bW1hcnkgPSBiaW5kX3Jvd3MoRjFfcmZfZWZmZWN0X3NpemUsIEYxX2JzX2VmZmVjdF9zaXplKSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KHZhcmlhYmxlLCBkaWZmZXJlbmNlLCAKIyAgICAgICAgICAgICAgICAgYmNhX2NpX2xvdywgYmNhX2NpX2hpZ2gsIAojICAgICAgICAgICAgICAgICBtb250aCwgZHVyYXRpb24sIHRyYWl0LCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lIAojICAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKIyAgICAgICAgICAib3JkZXJfbnVtYmVyIiA9IGNhc2Vfd2hlbigKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fc2hvcnQiIH4gMSwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInByb2R1Y3Rpb25fbG9uZyIgfiAyLAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAiYm9keSBzaXplX3Nob3J0IiB+IDMsCiMgICAgICAgICAgICBvcmRlcl9jb2RlID09ICJib2R5IHNpemVfbG9uZyIgfiA0KSwKIyAgICAgICAgICBtb250aCA9IGZjdF9yZWxldmVsKG1vbnRoLCAiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSkKIyAKIyBGMV9zdW1tYXJ5JG9yZGVyX251bWJlciA9IGZhY3RvcihGMV9zdW1tYXJ5JG9yZGVyX251bWJlciwgbGV2ZWxzID0gYygxLDIsMyw0KSkKIyBGMV9ncmlkID0gZ2dwbG90KEYxX3N1bW1hcnksIGFlcyh4ID0gb3JkZXJfbnVtYmVyLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIHNoYXBlID0gZHVyYXRpb24sIGdyb3VwID0gdHJhaXQpKSArCiMgICBmYWNldF9ncmlkKG9mZl90ZW1wIH4gbW9udGgsICkgKyAKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKwojICAgZ2VvbV9saW5lKCkgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEpICsgCiMgICBnZW9tX3BvaW50KHNpemUgPSAzLCBmaWxsID0gIndoaXRlIikgKyAKIyAgIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzID0gYygiYm9keSBzaXplIiA9ICJncmV5NzUiLCAicHJvZHVjdGlvbiIgPSAiYmxhY2siKSkgKyAKIyAgIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKCJsb25nIiA9IDE2LCAic2hvcnQiID0gMjEpKSArIAojICAgeGxpbSgwLjUsNC41KSArIAojICAgc2NhbGVfeF9kaXNjcmV0ZShsYWJlbHM9IHguYXhpc19sYWJlbHMpICsKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkVmZmVjdCBTaXplXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgZ2d0aXRsZSgiVHJhbnNnZW5lcmF0aW9uYWwgRWZmZWN0cyAoRjEpIikgKyAKIyAgIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDEyKSArIAojICAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHN0cmlwLmJhY2tncm91bmQueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIHN0cmlwLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgIGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChjb2xvdXIgPSAiYmxhY2siKSwKIyAgICAgICAgIGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gLTQ1LCBoanVzdCA9IDAsIHZqdXN0ID0gMC41KSkKIyAKIyBnZ2FycmFuZ2UoRjBfZ3JpZCwgRjFfZ3JpZCwgbnJvdyA9IDIsIG5jb2wgPSAxLCBoZWlnaHRzID0gYygwLjQ1LDEpLCBjb21tb24ubGVnZW5kID0gVCwgbGVnZW5kID0gInJpZ2h0IikKYGBgCgojIyBTdXBwbGVtZW50YWwgSW5mb3JtYXRpb24gICAKYGBge3IgcGFyYW1ldGVycy1tb250aCwgZmlnLmhlaWdodD05LCBmaWcud2lkdGg9MTF9CiNmaWVsZCB0cGMgcGFyYW1ldGVycwpjb21iX3BhcmFtcyAlPiUgIAogIG11dGF0ZShjdXJ2ZV9pZCA9IGZjdF9yZWxldmVsKGN1cnZlX2lkLCBjKCJKYW51YXJ5IiwgIkZlYnJ1YXJ5IiwgIk1hcmNoIiwgIkFwcmlsIiwgIk1heSIsICJKdW5lIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkp1bHkiLCAiQXVndXN0IiwgIlNlcHRlbWJlciIsICJPY3RvYmVyIiwgIk5vdmVtYmVyXzEiLCAiTm92ZW1iZXJfMiIpKSkgJT4lIAogIGdncGxvdChhZXMoeCA9IGN1cnZlX2lkLCB5ID0gZXN0aW1hdGUsIGNvbG91ciA9IHNwZWNpZXMpKSArCiAgZmFjZXRfd3JhcCh0ZXJtfm1ldHJpYywgc2NhbGVzID0gJ2ZyZWVfeScpICsgCiAgZ2VvbV9wb2ludChzaXplID0gNCkgKwogIGdlb21fbGluZXJhbmdlKGFlcyh5bWluID0gY29uZl9sb3dlciwgeW1heCA9IGNvbmZfdXBwZXIpKSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImluZGlhbnJlZDIiKSkgKyAKICBsYWJzKHggPSAiTW9udGgiLAogICAgICAgeSA9ICJQYXJhbWV0ZXIgRXN0aW1hdGUiLAogICAgICAgY29sb3VyID0gIlNwZWNpZXMiKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE2KSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICBheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDMxNSwgaGp1c3QgPSAwLCB2anVzdCA9IDAuNSkpCmBgYAoKYGBge3IgcGFyYW1ldGVycy1jb2xsLXRlbXAsIGZpZy5oZWlnaHQ9NywgZmlnLndpZHRoPTl9CiNmaWVsZCB0cGMgcGFyYW1ldGVycwpnZ3Bsb3QoY29tYl9wYXJhbXMsIGFlcyh4ID0gZ3Jvd3RoX3RlbXAsIHkgPSBlc3RpbWF0ZSwgY29sb3VyID0gc3BlY2llcykpICsKICBmYWNldF93cmFwKHRlcm1+bWV0cmljLCBzY2FsZXMgPSAnZnJlZV95JykgKyAKICBnZW9tX3Ntb290aChkYXRhID0gZmlsdGVyKGNvbWJfcGFyYW1zLCBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIHNlID0gRikgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgZ2VvbV9saW5lcmFuZ2UoYWVzKHltaW4gPSBjb25mX2xvd2VyLCB5bWF4ID0gY29uZl91cHBlcikpICsKICBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoInJveWFsYmx1ZTEiLCAiaW5kaWFucmVkMiIpKSArIAogIGxhYnMoeCA9ICJDb2xsZWN0aW9uIFRlbXBlcmF0dXJlICjCsEMpIiwKICAgICAgIHkgPSAiUGFyYW1ldGVyIEVzdGltYXRlIiwKICAgICAgIGNvbG91ciA9ICJTcGVjaWVzIikgKyAKICB0aGVtZV9idyhiYXNlX3NpemUgPSAxMikgKwogIHRoZW1lKHBhbmVsLmdyaWQgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgbWFyZ2lucy1jb2xsLXRlbXAsIGZpZy5oZWlnaHQ9OSwgZmlnLndpZHRoPTd9CmNvbWJfcGFyYW1zICU+JSAKICBmaWx0ZXIodGVybSA9PSAidG9wdCIpICU+JSAKICBnZ3Bsb3QoYWVzKHggPSBncm93dGhfdGVtcCwgeSA9IG1hcmdpbiwgY29sb3VyID0gc3BlY2llcywgZ3JvdXAgPSBzcGVjaWVzKSkgKyAKICBmYWNldF9ncmlkKG1ldHJpY34uLCBzY2FsZXMgPSAnZnJlZV95JykgKyAKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9zbW9vdGgoZGF0YSA9IGZpbHRlcihjb21iX3BhcmFtcywgdGVybSA9PSAidG9wdCIgJiBjdXJ2ZV9pZCAhPSAiTm92ZW1iZXJfMiIpLAogICAgICAgICAgICAgIG1ldGhvZCA9ICJsbSIsIHNlID0gRiwgbGluZXdpZHRoID0gMSwgY29sb3VyID0gImJsYWNrIikgKyAKICBnZW9tX3BvaW50KHNpemUgPSA0KSArCiAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJyb3lhbGJsdWUxIiwgImluZGlhbnJlZDIiKSkgKyAKICBsYWJzKHggPSAiQ29sbGVjdGlvbiBUZW1wZXJhdHVyZSIsCiAgICAgICB5ID0gIlNhZmV0eSBNYXJnaW4iKSArIAogIHRoZW1lX2J3KGJhc2Vfc2l6ZSA9IDE4KSArCiAgdGhlbWUocGFuZWwuZ3JpZCA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7cn0KZ2dwbG90KGYwX21vZGVsX2RhdGEsIAogICAgICAgYWVzKHggPSBEYXksIHkgPSBIYXRjaGVkLCBjb2xvdXIgPSBNb250aCwgZ3JvdXAgPSBmZW1hbGVfSUQpKSArIAogIGZhY2V0X2dyaWQoTW9udGh+VHJlYXRtZW50LCBzY2FsZXMgPSAiZnJlZV95IikgKyAKICBnZW9tX2xpbmUoKSArIAogIHRoZW1lX21hdHQoKSArIAogIHRoZW1lKHBhbmVsLmJvcmRlciA9IGVsZW1lbnRfcmVjdChmaWxsID0gTkEsIGNvbG91ciA9ICJibGFjayIpKQpgYGAKCgpgYGB7ciBlZmZlY3Qtc2l6ZS1ncmlkLCBmaWcuaGVpZ2h0PTgsIGZpZy53aWR0aD04fQojICNTdWJzZXF1ZW50IFJvd3MKIyBGMV9oc19lZmZlY3Rfc2l6ZSR0cmFpdCA9ICJzdWNjZXNzIgojIEYxX2hzX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCiMgCiMgRjFfdG90YWxfZWZmZWN0X3NpemUkdHJhaXQgPSAiZXByIgojIEYxX3RvdGFsX2VmZmVjdF9zaXplJGdlbmVyYXRpb24gPSAiRjEiCiMgCiMgRjFfcmZfZWZmZWN0X3NpemUkdHJhaXQgPSAicHJvZHVjdGlvbiIKIyBGMV9yZl9lZmZlY3Rfc2l6ZSRnZW5lcmF0aW9uID0gIkYxIgojIAojIEYxX2JzX2VmZmVjdF9zaXplJHRyYWl0ID0gImJvZHkgc2l6ZSIKIyBGMV9ic19lZmZlY3Rfc2l6ZSRnZW5lcmF0aW9uID0gIkYxIgojIAojIEYwX2RhdGEgPSBiaW5kX3Jvd3MoRjBfaHNfc3VtbWFyeSwgRjBfdG90YWxfc3VtbWFyeSxGMF9yZl9zdW1tYXJ5LCBGMF9zaXplX3N1bW1hcnkpICU+JSAKIyAgIGRwbHlyOjpzZWxlY3QodHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoLCBtb250aCwgZHVyYXRpb24sIHRyYWl0LCBnZW5lcmF0aW9uKSAlPiUgCiMgICBtdXRhdGUoIm9yZGVyX2NvZGUiID0gcGFzdGUodHJhaXQsIGR1cmF0aW9uLCBzZXAgPSAiXyIpLAojICAgICAgICAgICJvcmRlcl9udW1iZXIiID0gY2FzZV93aGVuKAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAidG90YWxfc2hvcnQiIH4gMSwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInRvdGFsX2xvbmciIH4gMiwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3Nfc2hvcnQiIH4gMywKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiA1LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9sb25nIiB+IDYsCiMgICAgICAgICAgICBvcmRlcl9jb2RlID09ICJzaXplX2xvbmciIH4gNyksCiMgICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIiksCiMgICAgICAgICAgdHJhaXQgPSBmY3RfcmVsZXZlbCh0cmFpdCwgInRvdGFsIiwgInN1Y2Nlc3MiLCAicHJvZHVjdGlvbiIsICJzaXplIiksCiMgICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgInNob3J0IiwgImxvbmciKSwKIyAgICAgICAgICBncm91cF9JRCA9IHBhc3RlKG1vbnRoLCB0cmFpdCwgc2VwID0gIl8iKSkKIyAKIyBGMF9kYXRhJG9yZGVyX251bWJlciA9IGZhY3RvcihGMF9kYXRhJG9yZGVyX251bWJlciwgbGV2ZWxzID0gYygxLDIsMyw0LDUsNiw3KSkKIyAKIyAKIyBGMV9kYXRhID0gYmluZF9yb3dzKEYxX3RvdGFsX2VmZmVjdF9zaXplLCBGMV9oc19lZmZlY3Rfc2l6ZSwgRjFfcmZfZWZmZWN0X3NpemUsIEYxX2JzX2VmZmVjdF9zaXplKSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCwgbW9udGgsIGR1cmF0aW9uLCBnZW5lcmF0aW9uLCBvZmZfdGVtcCkgJT4lIAojICAgbXV0YXRlKCJvcmRlcl9jb2RlIiA9IHBhc3RlKHRyYWl0LCBkdXJhdGlvbiwgc2VwID0gIl8iKSwKIyAgICAgICAgICAib3JkZXJfbnVtYmVyIiA9IGNhc2Vfd2hlbigKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImVwcl9zaG9ydCIgfiAxLAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAiZXByX2xvbmciIH4gMiwKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3Nfc2hvcnQiIH4gMywKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gInN1Y2Nlc3NfbG9uZyIgfiA0LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9zaG9ydCIgfiA1LAojICAgICAgICAgICAgb3JkZXJfY29kZSA9PSAicHJvZHVjdGlvbl9sb25nIiB+IDYsCiMgICAgICAgICAgICBvcmRlcl9jb2RlID09ICJib2R5IHNpemVfc2hvcnQiIH4gNywKIyAgICAgICAgICAgIG9yZGVyX2NvZGUgPT0gImJvZHkgc2l6ZV9sb25nIiB+IDgpLAojICAgICAgICAgIHRyYWl0ID0gaWZfZWxzZSh0cmFpdCA9PSAiZXByIiwgInRvdGFsIiwgdHJhaXQpLAojICAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsICJKdW5lIiwgIkF1Z3VzdCIsICJOb3ZlbWJlciIpLAojICAgICAgICAgIHRyYWl0ID0gZmN0X3JlbGV2ZWwodHJhaXQsICJ0b3RhbCIsICJzdWNjZXNzIiwgInByb2R1Y3Rpb24iLCAic2l6ZSIpLAojICAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sICJzaG9ydCIsICJsb25nIikpCiMgCiMgCiMgRjFfZGF0YSRvcmRlcl9udW1iZXIgPSBmYWN0b3IoRjFfZGF0YSRvcmRlcl9udW1iZXIsIGxldmVscyA9IGMoMSwyLDMsNCw1LDYsNyw4KSkKIyAKIyAjVG9wIHJvdyAtIEYwIChkaXJlY3QgZWZmZWN0cykKIyB4LmF4aXNfbGFiZWxzID0gYygiMSIgPSAic2hvcnQiLCAiMiIgPSAibG9uZyIsICIzIiA9ICJzaG9ydCIsICI0IiA9ICJsb25nIiwgCiMgICAgICAgICAgICAgICAgICAgIjUiID0gInNob3J0IiwgIjYiID0gImxvbmciLCAiNyIgPSAic2hvcnQiLCAiOCIgPSAibG9uZyIpCiMgCiMgRjBfZ3JpZCA9IGdncGxvdChGMF9kYXRhLCBhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gdHJhaXQsIGdyb3VwID0gZ3JvdXBfSUQpKSArIAojICAgZmFjZXRfZ3JpZCguIH4gbW9udGgpICsgCiMgICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNyksCiMgICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKyAKIyAgIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDAsIGNvbG91ciA9ICJibGFjayIsIGxpbmV3aWR0aCA9IDAuMykgKwojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksIHdpZHRoID0gMCwgbGluZXdpZHRoID0gMSwgCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpKSArIAojICAgZ2VvbV9wb2ludChzaXplID0gNCwgZmlsbCA9ICJ3aGl0ZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjcpKSArIAojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiMgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwojICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJzaXplIiA9ICJkYXJrZ3JleSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiID0gImdvbGQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0aW9uIiA9ICJmb3Jlc3RncmVlbiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArICAKIyAgIHhsYWIoIiIpICsKIyAgIHlsYWIoIkVmZmVjdCBTaXplXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpLAojICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQojIAojICNGb2xsb3dpbmcgdGhyZWUgcm93cyAtIEYxICh0cmFuc2dlbmVyYXRpb24gLyBpbmRpcmVjdCBlZmZlY3RzKQojIEYxX2dyaWQgPSBnZ3Bsb3QoRjFfZGF0YSwgYWVzKHggPSBkdXJhdGlvbiwgeSA9IGRpZmZlcmVuY2UsIGNvbG91ciA9IHRyYWl0LCBncm91cCA9IHRyYWl0KSkgKyAKIyAgIGZhY2V0X2dyaWQob2ZmX3RlbXAgfiBtb250aCwgKSArIAojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCwgY29sb3VyID0gImJsYWNrIiwgbGluZXdpZHRoID0gMC4zKSArCiMgICBnZW9tX2xpbmUocG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuNSksCiMgICAgICAgICAgICAgbGluZXdpZHRoID0gMSkgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLCB3aWR0aCA9IDAsIGxpbmV3aWR0aCA9IDEsCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAojICAgZ2VvbV9wb2ludChzaXplID0gMywgZmlsbCA9ICJ3aGl0ZSIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjUpKSArIAojICAgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoImxvbmciID0gMTYsICJzaG9ydCIgPSAyMSkpICsgCiMgICB4bGltKDAuNSw0LjUpICsgCiMgICBzY2FsZV94X2Rpc2NyZXRlKGxhYmVscz0geC5heGlzX2xhYmVscykgKwojICAgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJzaXplIiA9ICJkYXJrZ3JleSIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Y2Nlc3MiID0gImdvbGQiLAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9kdWN0aW9uIiA9ICJmb3Jlc3RncmVlbiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvdGFsIiA9ICJjb3JuZmxvd2VyYmx1ZSIpKSArIAojICAgeGxhYigiIikgKwojICAgeWxhYigiRWZmZWN0IFNpemUgXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgdGhlbWVfYncoYmFzZV9zaXplID0gMTIpICsgCiMgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgc3RyaXAuYmFja2dyb3VuZC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgc3RyaXAudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGUgPSAtNDUsIGhqdXN0ID0gMCwgdmp1c3QgPSAwLjUpKQojIAojIGdnYXJyYW5nZShGMF9ncmlkLCBGMV9ncmlkLCBucm93ID0gMiwgbmNvbCA9IDEsIGhlaWdodHMgPSBjKDAuMzUsMSksIGNvbW1vbi5sZWdlbmQgPSBULCBsZWdlbmQgPSAicmlnaHQiLCBsYWJlbHMgPSAiQVVUTyIpCmBgYAoKYGBge3IgcHJvZHVjdGlvbi1zaXplLWNoYW5nZX0KIyBlZmZlY3RfY29yciA9IEYxX3N1bW1hcnkgJT4lIAojICAgc2VsZWN0KHRyYWl0LCBkaWZmZXJlbmNlLCBtb250aCwgZHVyYXRpb24sIG9mZl90ZW1wKSAlPiUgIAojICAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCksCiMgICAgICAgICAgICAgICBuYW1lc19mcm9tID0gdHJhaXQsIAojICAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBkaWZmZXJlbmNlKQojIAojIGdncGxvdChlZmZlY3RfY29yciwgYWVzKHggPSBgYm9keSBzaXplYCwgeSA9IHByb2R1Y3Rpb24pKSArIAojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsgCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArIAojICAgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGLAojICAgICAgICAgICAgICAgY29sb3VyID0gImdyZXk2MCIsCiMgICAgICAgICAgICAgICBzaXplID0gMSkgKyAKIyAgIGxhYnMoeCA9ICJCb2R5IFNpemUgRWZmZWN0IiwKIyAgICAgICAgeSA9ICJQcm9kdWN0aW9uIEVmZmVjdCIpICsgCiMgICB0aGVtZV9tYXR0KCkKYGBgCgoKYGBge3IgRjAtcHJvZHVjdGlvbiwgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojRjBfZmVjdW5kaXR5X3Bsb3QKYGBgCgpgYGB7ciBGMC1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQojRWZmZWN0IG9mIGhlYXR3YXZlIGR1cmF0aW9uIFdJVEhJTiB0cmVhdG1lbnQKCmYwX21vZGVsX2RhdGEgJT4lICAKICBncm91cF9ieShUcmVhdG1lbnQsIERheSwgTW9udGgpICU+JSAKICBzdW1tYXJpc2UobWVhbl9oYXRjaGVkID0gbWVhbihIYXRjaGVkLCBuYS5ybSA9IFQpKSAlPiUgCiAgdW5ncm91cCgpICU+JSAKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygiVHJlYXRtZW50IiwgIk1vbnRoIiksCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBtZWFuX2hhdGNoZWQsIAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSBEYXkpICU+JSAKICBtdXRhdGUoImVmZmVjdCIgPSBgNV90b183YCAtIGAxX3RvXzNgKQoKZHVyYXRpb24ubW9kZWwgPSBsbWU0OjpsbWVyKGRhdGEgPSBmMF9tb2RlbF9kYXRhLCAKICAgICAgICAgICAgICAgICAgICBIYXRjaGVkIH4gVHJlYXRtZW50ICogRGF5ICogTW9udGggKyAoMXxNb250aCkpCgpkdXJhdGlvbl9wYWlycyA9IGVtbWVhbnM6OmVtbWVhbnMoZHVyYXRpb24ubW9kZWwsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfiBEYXkgfCBNb250aCAqIFRyZWF0bWVudCkgJT4lIAogIHBhaXJzKCkKCmFzLmRhdGEuZnJhbWUoc3VtbWFyeShkdXJhdGlvbl9wYWlycykpW2MoJ01vbnRoJywgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1RyZWF0bWVudCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250cmFzdCcsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlc3RpbWF0ZScsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTRScpXSAlPiUgCiAgbXV0YXRlKE1vbnRoID0gZmN0X3JlbGV2ZWwoTW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpLAogICAgICAgICBlc3RpbWF0ZSA9IGVzdGltYXRlICogLTEpICU+JSAjRmxpcHMgc2lnbiB0byBtYWtlIGNvbnRyYXN0IExvbmcgLSBTaG9ydAogIGdncGxvdChhZXMoeCA9IE1vbnRoLCBmaWxsID0gVHJlYXRtZW50LCB5ID0gZXN0aW1hdGUpKSArIAogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC45KSwgY29sb3VyID0gImJsYWNrIiwgc2l6ZSA9IDEpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGVzdGltYXRlIC0gU0UsIHltYXggPSBlc3RpbWF0ZSArIFNFKSwKICAgICAgICAgICAgICAgIHdpZHRoID0gMC4xLCBzaXplID0gMSwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjkpKSArIAogIGdlb21faGxpbmUoeWludGVyY2VwdCA9IDApICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYygiZ3JleTMwIiwgIndoaXRlIikpICsgCiAgbGFicyh4ID0gIiIsCiAgICAgICB5ID0gIkR1cmF0aW9uIENvbnRyYXN0IFxuIExvbmcgLSBTaG9ydCBldmVudHMiKSArIAogIHRoZW1lX3B1YnIoYmFzZV9zaXplID0gMTgpCmBgYAoKYGBge3IgRjEtZHVyYXRpb24tZWZmZWN0cywgZmlnLndpZHRoPTgsIGZpZy5oZWlnaHQ9OH0KIyBIb3cgZG9lcyBoZWF0IHdhdmUgZHVyYXRpb24gYWZmZWN0IHRyYW5zZ2VuZXJhdGlvbmFsIGVmZmVjdHM/IFJlYWN0aW9uIG5vcm1zIHNob3duIGJlbG93IGZvciBlZmZlY3Qgc2l6ZSBjb21wYXJpc29ucyAoaGVhdHdhdmUgLSBjb250cm9sKSBmb3IgZGlmZmVyZW50IGR1cmF0aW9uIG9mIHBhcmVudGFsIGV4cG9zdXJlCiMgRjFfZGF0YSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXAsIHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCkgJT4lIAojICAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAojICAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpLAojICAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sIGMoInNob3J0IiwgImxvbmciKSkpICU+JSAKIyAgIGdncGxvdChhZXMoeCA9IGR1cmF0aW9uLCB5ID0gZGlmZmVyZW5jZSwgY29sb3VyID0gbW9udGgsIGdyb3VwID0gSUQpKSArIAojICAgZmFjZXRfd3JhcCh0cmFpdH4uKSArIAojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKyAKIyAgIGdlb21fbGluZShzaXplID0gMSwgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiMgICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW4gPSBiY2FfY2lfbG93LCB5bWF4ID0gYmNhX2NpX2hpZ2gpLAojICAgICAgICAgICAgICAgICBzaXplID0gMC43NSwgd2lkdGggPSAwLjEsCiMgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjEpKSArIAojICAgbGFicyh4ID0gIlBhcmVudGFsIEV4cG9zdXJlIER1cmF0aW9uIiwgCiMgICAgICAgIHkgPSAiRWZmZWN0IFNpemUgKEhlZGdlJ3MgZykgXG4gSGVhdHdhdmUgLSBDb250cm9sIikgKyAKIyAgIHlsaW0oLTUsNSkgKyAKIyAgIHRoZW1lX3B1YnIoYmFzZV9zaXplID0gMTgpCmBgYAoKCmBgYHtyIHNpZy1GMS1kdXJhdGlvbi1lZmZlY3RzLCBmaWcud2lkdGg9OCwgZmlnLmhlaWdodD04fQojICNQdWxscyBvdXQgcmVhY3Rpb24gbm9ybXMgd2hlcmUgdGhlcmUncyBhIHNpZ24gY2hhbmdlIChjaGFuZ2VzIGZyb20gcG9zaXRpdmUsIG5ldXRyYWwsIG9yIG5lZ2F0aXZlIGJldHdlZW4gZHVyYXRpb24gZ3JvdXBzKSAKIyAKIyBkdXJhdGlvbl9lZmZlY3RzID0gRjFfZGF0YSAlPiUgCiMgICBkcGx5cjo6c2VsZWN0KG1vbnRoLCBkdXJhdGlvbiwgb2ZmX3RlbXAsIHRyYWl0LCBkaWZmZXJlbmNlLCBiY2FfY2lfbG93LCBiY2FfY2lfaGlnaCkgJT4lIAojICAgbXV0YXRlKCJJRCIgPSBwYXN0ZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0LCBzZXAgPSAiXyIpLAojICAgICAgICAgIG1vbnRoID0gZmN0X3JlbGV2ZWwobW9udGgsIGMoIkp1bmUiLCAiQXVndXN0IiwgIk5vdmVtYmVyIikpLAojICAgICAgICAgIGR1cmF0aW9uID0gZmN0X3JlbGV2ZWwoZHVyYXRpb24sIGMoInNob3J0IiwgImxvbmciKSkpICU+JSAKIyAgIGdyb3VwX2J5KElELCB0cmFpdCwgZHVyYXRpb24pICU+JSAgCiMgICBtdXRhdGUoInplcm9fZGlmZiIgPSBjYXNlX3doZW4oCiMgICAgIHNpZ24oYmNhX2NpX2xvdykgPT0gc2lnbihiY2FfY2lfaGlnaCkgfiAiZG9lcyBub3Qgb3ZlcmxhcCB6ZXJvIiwKIyAgICAgc2lnbihiY2FfY2lfbG93KSAhPSBzaWduKGJjYV9jaV9oaWdoKSB+ICJvdmVybGFwcyB6ZXJvIgojICAgKSkgJT4lIAojICAgdW5ncm91cChkdXJhdGlvbikgJT4lIAojICAgbXV0YXRlKCJjaGFuZ2UiID0gY2FzZV93aGVuKAojICAgICBzaWduKGRpZmZlcmVuY2UpWzFdID09IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gPT0gemVyb19kaWZmWzJdIH4gIlNhbWUiLAojICAgICBzaWduKGRpZmZlcmVuY2UpWzFdICE9IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gPT0gIm92ZXJsYXBzIHplcm8iICYgemVyb19kaWZmWzJdID09ICJvdmVybGFwcyB6ZXJvIiB+ICJTYW1lIiwKIyAgICAgc2lnbihkaWZmZXJlbmNlKVsxXSAhPSBzaWduKGRpZmZlcmVuY2UpWzJdICYgemVyb19kaWZmWzFdID09IHplcm9fZGlmZlsyXSAmIHplcm9fZGlmZlsxXSA9PSAiZG9lcyBub3Qgb3ZlcmxhcCB6ZXJvIiB+ICJEaWZmZXJlbnQiLAojICAgICBzaWduKGRpZmZlcmVuY2UpWzFdICE9IHNpZ24oZGlmZmVyZW5jZSlbMl0gJiB6ZXJvX2RpZmZbMV0gIT0gemVyb19kaWZmWzJdIH4gIkRpZmZlcmVudCIsCiMgICAgIHNpZ24oZGlmZmVyZW5jZSlbMV0gPT0gc2lnbihkaWZmZXJlbmNlKVsyXSAmIHplcm9fZGlmZlsxXSAhPSB6ZXJvX2RpZmZbMl0gfiAiRGlmZmVyZW50IgojICAgKSkgJT4lIAojICAgYXJyYW5nZShtb250aCwgb2ZmX3RlbXAsIHRyYWl0KSAlPiUgCiMgICBmaWx0ZXIoY2hhbmdlID09ICJEaWZmZXJlbnQiKQojIAojIHNlbGVjdF9ybm9ybXMgPSBkdXJhdGlvbl9lZmZlY3RzICU+JSAKIyAgIGRwbHlyOjpzZWxlY3QoLWR1cmF0aW9uLCAtZGlmZmVyZW5jZSwgLWJjYV9jaV9sb3csIC1iY2FfY2lfaGlnaCwgLUlELCAtemVyb19kaWZmKSAlPiUgCiMgICBkaXN0aW5jdCgpCiMgCiMgc2lnX2NoYW5nZXMgPSBGMV9kYXRhICU+JSAKIyAgIGRwbHlyOjpzZWxlY3QobW9udGgsIGR1cmF0aW9uLCBvZmZfdGVtcCwgdHJhaXQsIGRpZmZlcmVuY2UsIGJjYV9jaV9sb3csIGJjYV9jaV9oaWdoKSAlPiUgCiMgICBtdXRhdGUoIklEIiA9IHBhc3RlKG1vbnRoLCBvZmZfdGVtcCwgdHJhaXQsIHNlcCA9ICJfIiksCiMgICAgICAgICAgbW9udGggPSBmY3RfcmVsZXZlbChtb250aCwgYygiSnVuZSIsICJBdWd1c3QiLCAiTm92ZW1iZXIiKSksCiMgICAgICAgICAgZHVyYXRpb24gPSBmY3RfcmVsZXZlbChkdXJhdGlvbiwgYygic2hvcnQiLCAibG9uZyIpKSkgJT4lIAojICAgZmlsdGVyKElEICVpbiUgc2VsZWN0X3Jub3JtcyRJRCkKIyAKIyBnZ3Bsb3Qoc2lnX2NoYW5nZXMsIGFlcyh4ID0gZHVyYXRpb24sIHkgPSBkaWZmZXJlbmNlLCBjb2xvdXIgPSBtb250aCwgZ3JvdXAgPSBJRCkpICsgCiMgICBmYWNldF93cmFwKHRyYWl0fi4pICsgCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArIAojICAgZ2VvbV9saW5lKHNpemUgPSAxLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gMC4xKSkgKyAKIyAgIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAwLjEpKSArIAojICAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbiA9IGJjYV9jaV9sb3csIHltYXggPSBiY2FfY2lfaGlnaCksCiMgICAgICAgICAgICAgICAgIHNpemUgPSAwLjc1LCB3aWR0aCA9IDAuMSwKIyAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IDAuMSkpICsgCiMgICBnZW9tX2xhYmVsX3JlcGVsKGRhdGEgPSBzaWdfY2hhbmdlcyAlPiUgZmlsdGVyKGR1cmF0aW9uID09ICJsb25nIiksIAojICAgICAgICAgICAgICAgICAgICBhZXMobGFiZWwgPSBvZmZfdGVtcCwgCiMgICAgICAgICAgICAgICAgICAgICAgICB4ID0gZHVyYXRpb24sCiMgICAgICAgICAgICAgICAgICAgICAgICB5ID0gZGlmZmVyZW5jZSwgCiMgICAgICAgICAgICAgICAgICAgICAgICBjb2xvciA9IG1vbnRoKSwKIyAgICAgICAgICAgICAgICAgICAgYm94LnBhZGRpbmcgPSAwLjUsCiMgICAgICAgICAgICAgICAgICAgIG51ZGdlX3ggPSAwLjIsCiMgICAgICAgICAgICAgICAgICAgIHNpemUgPSA3LAojICAgICAgICAgICAgICAgICAgICBzaG93LmxlZ2VuZD1GQUxTRSkgKyAKIyAgIGxhYnMoeCA9ICJQYXJlbnRhbCBFeHBvc3VyZSBEdXJhdGlvbiIsIAojICAgICAgICB5ID0gIkVmZmVjdCBTaXplIChIZWRnZSdzIGcpXG5IZWF0d2F2ZSAtIENvbnRyb2wiKSArIAojICAgeWxpbSgtNSw1KSArIAojICAgdGhlbWVfcHVicihiYXNlX3NpemUgPSAxOCkKYGBgCgoKYGBge3IsIGluY2x1ZGUgPSBGfQojIHJkYXRhID0gZmlsZV9saXN0W3N0cl9kZXRlY3QoZmlsZV9saXN0LCBwYXR0ZXJuID0gIi5SRGF0YSIpXQojIGYxX2RhdGEgPSByZGF0YVtzdHJfZGV0ZWN0KHJkYXRhLCBwYXR0ZXJuID0gIkYwXyIsIG5lZ2F0ZSA9IFQpXSAlPiUgCiMgICBzdHJfc3BsaXRfZml4ZWQocGF0dGVybiA9ICIuUkRhdGEiLCBuID0gMikKIyBmMV9kYXRhID0gZjFfZGF0YVssMV0KIyAKIyBwbG90X25hbWVzID0gYygpCiMgZm9yKGkgaW4gMTpsZW5ndGgoZjFfZGF0YSkpewojICAgcGxvdF9uYW1lID0gcGFzdGUoZjFfZGF0YVtpXSwgIl9wbG90Iiwgc2VwID0gIiIpCiMgICBwbG90X25hbWVzID0gYyhwbG90X25hbWVzLCBwbG90X25hbWUpCiMgICBtZXRyaWMgPSBzdHJfc3BsaXRfZml4ZWQocGxvdF9uYW1lLCBwYXR0ZXJuID0gIl8iLCBuID0gNClbLDJdCiMgICAKIyAgIGlmKG1ldHJpYyA9PSAidG90YWwiKXsKIyAgICAgbGFiZWwgPSAiRWdnIFByb2R1Y3Rpb24gKHBlciBmZW1hbGUpIgojICAgfQojICAgCiMgICBpZihtZXRyaWMgPT0gInJmIil7CiMgICAgIGxhYmVsID0gIlByb2R1Y3Rpb24gKHBlciBmZW1hbGUpIgojICAgfQojICAgCiMgICBpZihtZXRyaWMgPT0gImhzIil7CiMgICAgIGxhYmVsID0gIkhhdGNoaW5nIFN1Y2Nlc3MgKCUpIgojICAgfQojICAgCiMgICBpZihtZXRyaWMgPT0gImJzIil7CiMgICAgIGxhYmVsID0gIkJvZHkgU2l6ZSAobW0pIgojICAgfQojICAgCiMgICBhc3NpZ24ocGxvdF9uYW1lLAojICAgICAgICAgIHBsb3QoZ2V0KGYxX2RhdGFbaV0pLCAKIyAgICAgICAgICAgICAgIGVmZnNpemUubWFya2Vyc2l6ZSA9IDIsCiMgICAgICAgICAgICAgICBheGVzLnRpdGxlLmZvbnRzaXplID0gOSwKIyAgICAgICAgICAgICAgIHRpY2suZm9udHNpemUgPSA2LAojICAgICAgICAgICAgICAgc3dhcm1wbG90LnBhcmFtcyA9IHBhcmFtX2xpc3QsCiMgICAgICAgICAgICAgICByYXdwbG90LnlsYWJlbCA9IGxhYmVsLAojICAgICAgICAgICAgICAgdGhlbWUgPSBnZ3B1YnI6OnRoZW1lX3B1YnIoKSkpCiMgfQojIAojIGJzX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX2JzXyIpXQojIHJmX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX3JmXyIpXQojIHRvdGFsX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX3RvdGFsXyIpXQojIGhzX3Bsb3RzID0gcGxvdF9uYW1lc1tzdHJfZGV0ZWN0KHBsb3RfbmFtZXMsIHBhdHRlcm4gPSAiX2hzXyIpXQpgYGAKCmBgYHtyIEYxLWJvZHktc2l6ZS1lZmYtcGxvdHMsIGZpZy5oZWlnaHQ9MTEsIGZpZy53aWR0aD04LCBpbmNsdWRlID0gRn0KIyBnZ2FycmFuZ2UoSnVuZV9ic19zaG9ydF9wbG90LCBKdW5lX2JzX2xvbmdfcGxvdCwgCiMgICAgICAgICAgIEF1Z3VzdF9ic19zaG9ydF9wbG90LCBBdWd1c3RfYnNfbG9uZ19wbG90LAojICAgICAgICAgICBOb3ZlbWJlcl9ic19zaG9ydF9wbG90LCBOb3ZlbWJlcl9ic19sb25nX3Bsb3QsCiMgICAgICAgICAgIG5jb2wgPSAyLCBucm93ID0gMywKIyAgICAgICAgICAgbGFiZWxzID0gIkFVVE8iLAojICAgICAgICAgICB2anVzdCA9IC0wLjIpCmBgYAoKYGBge3IgRjEtdG90YWwtZXByLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX3RvdGFsX3Nob3J0X3Bsb3QsIEp1bmVfdG90YWxfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X3RvdGFsX3Nob3J0X3Bsb3QsIEF1Z3VzdF90b3RhbF9sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX3RvdGFsX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX3RvdGFsX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCgpgYGB7ciBGMS1oYXRjaGluZy1zdWNjZXNzLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX2hzX3Nob3J0X3Bsb3QsIEp1bmVfaHNfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X2hzX3Nob3J0X3Bsb3QsIEF1Z3VzdF9oc19sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX2hzX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX2hzX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCgpgYGB7ciBGMS1wcm9kdWN0aW9uLWVmZi1wbG90cywgZmlnLmhlaWdodD0xMSwgZmlnLndpZHRoPTgsIGluY2x1ZGUgPSBGfQojIGdnYXJyYW5nZShKdW5lX3JmX3Nob3J0X3Bsb3QsIEp1bmVfcmZfbG9uZ19wbG90LCAKIyAgICAgICAgICAgQXVndXN0X3JmX3Nob3J0X3Bsb3QsIEF1Z3VzdF9yZl9sb25nX3Bsb3QsCiMgICAgICAgICAgIE5vdmVtYmVyX3JmX3Nob3J0X3Bsb3QsIE5vdmVtYmVyX3JmX2xvbmdfcGxvdCwKIyAgICAgICAgICAgbmNvbCA9IDIsIG5yb3cgPSAzLAojICAgICAgICAgICBsYWJlbHMgPSAiQVVUTyIsCiMgICAgICAgICAgIHZqdXN0ID0gLTAuMikKYGBgCg==